/*
 * Shows all symbols of an ELF object by using PPCGetObjectAttrs()
 *
 * __reg("xx") is vbcc-specific. If you use another compiler you
 * will have to change it.
 */

#include <exec/libraries.h>
#include <utility/tagitem.h>
#include <powerup/ppclib/object.h>
#include <proto/exec.h>
#include <proto/dos.h>
#include <proto/ppc.h>

struct Library *PPCLibBase;


static void ScanHookFunc(__reg("a0")struct Hook *MyHook,
                         __reg("a2")void *MyElfStruct,
                         __reg("a1")struct PPCObjectInfo *MyInfo)
{
  Printf("0x%08lx\t0x%08lx\t%s\n",
         MyInfo->Address,
         MyInfo->Size,
         MyInfo->Name);
}


main(int argc,char *argv[])
{
  if (argc != 2) {
    Printf("Usage: %s <elf-object>\n",argv[0]);
    exit(1);
  }

  if (PPCLibBase = OpenLibrary("ppc.library",46)) {
    void *eo;

    if (eo = PPCLoadObject(argv[1])) {
      struct PPCObjectInfo MyInfo;
      struct TagItem MyTags[2];
      struct Hook MyScanSymbolHook;

      MyScanSymbolHook.h_Entry = (ULONG (*)(void)) ScanHookFunc;
      MyScanSymbolHook.h_SubEntry = (ULONG (*)(void)) NULL;
      MyScanSymbolHook.h_Data = (APTR) PPCLibBase;
      MyTags[0].ti_Tag = PPCELFINFOTAG_SCANSYMBOLHOOK;
      MyTags[0].ti_Data = (ULONG)&MyScanSymbolHook;
      MyTags[1].ti_Tag = TAG_END;
      PPCGetObjectAttrs(eo,&MyInfo,MyTags);
      PPCUnLoadObject(eo);
    }
    else
      Printf("Can't load ELF object %s\n",argv[1]);
    CloseLibrary(PPCLibBase);
  }
  else {
    Printf("Can't open ppc.library V46!\n");
    exit(1);
  }
  exit(0);
}
