home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / octave-1.1.1p1-src.tgz / tar.out / fsf / octave / dld / test / general / read-a.out.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  3KB  |  96 lines

  1. #include <stdio.h>
  2. #include <a.out.h>
  3.  
  4. #if defined(sun) && defined(sparc)
  5. #define relocation_info reloc_info_sparc
  6. #endif
  7.     
  8. read_a_out (argc, argv)
  9. int argc;
  10. char **argv;
  11. {
  12.     struct exec header;
  13.     struct relocation_info relo;
  14.     struct nlist name_list;
  15.     FILE *objfile;
  16.     char *string;
  17.     int str_size;
  18.     int i;
  19.  
  20.     if (argc < 1) exit ();
  21.  
  22.     if ((objfile = fopen (argv[1], "r")) == NULL) {
  23.     perror ("Can't open object file");
  24.     exit ();
  25.     }
  26.  
  27.     if (!fread (&header, sizeof(header), 1, objfile)) {
  28.     perror ("Can't read header");
  29.     exit ();
  30.     }
  31. #ifndef linux
  32.     printf ("Header information:\nmagic = 0%o, text size = %d, data size = %d\n",
  33.         header.a_magic, header.a_text, header.a_data);
  34. #endif
  35.     printf ("bss size = %d, syms size = %d, entry point = 0x%x, trsize = %d, drsize = %d\n",
  36.         header.a_bss, header.a_syms, header.a_entry, header.a_trsize,
  37.         header.a_drsize);
  38.  
  39.     
  40.     fseek (objfile, header.a_text + header.a_data + header.a_bss, 1);
  41.     if (header.a_trsize != 0) {
  42.     printf ("\n\nText relocation info\n");
  43.     for (i=0; i<(header.a_trsize/sizeof(relo)); i++) {
  44.         fread (&relo, sizeof(relo), 1, objfile);
  45.  
  46. #if defined(sun) && defined(sparc)
  47.         printf ("Address = 0x%x, local offset = %d\n",
  48.             relo.r_address, relo.r_index);
  49.         printf ("extern = %d, relocation type = %d, addend = %d\n",
  50.             relo.r_extern, relo.r_type, relo.r_addend);
  51. #else
  52.         
  53.         printf ("Address = 0x%x, local offset = %d\n",
  54.             relo.r_address, relo.r_symbolnum);
  55.         printf ("pc relocated = %d, length = %d, extern = %d\n",
  56.             relo.r_pcrel, relo.r_length, relo.r_extern);
  57. #endif        
  58.     }
  59.     }
  60.  
  61.     if (header.a_drsize != 0) {
  62.     printf ("\n\nData relocation info\n");
  63.     for (i=0; i<(header.a_trsize/sizeof(relo)); i++) {
  64.         fread (&relo, sizeof(relo), 1, objfile);
  65.  
  66. #if defined(sun) && defined(sparc)
  67.         printf ("Address = 0x%x, local offset = %d\n",
  68.             relo.r_address, relo.r_index);
  69.         printf ("extern = %d, relocation type = %d, addend = %d\n",
  70.             relo.r_extern, relo.r_type, relo.r_addend);
  71. #else
  72.         
  73.         printf ("Address = 0x%x, local offset = %d\n",
  74.             relo.r_address, relo.r_symbolnum);
  75.         printf ("pc relocated = %d, length = %d, extern = %d\n",
  76.             relo.r_pcrel, relo.r_length, relo.r_extern);
  77. #endif        
  78.     }
  79.     }
  80.  
  81.     fseek (objfile, N_STROFF(header), 0);
  82.     fread (&str_size, sizeof(str_size), 1, objfile);
  83.     string = (char *) malloc (str_size);
  84.     fseek (objfile, N_STROFF(header), 0);
  85.     fread (string, 1, str_size, objfile);
  86.  
  87.     fseek (objfile, N_SYMOFF(header), 0);
  88.  
  89.     printf ("\n\n");
  90.     for (i=0; i<(header.a_syms/sizeof(struct nlist)); i++) {
  91.     fread (&name_list, sizeof (struct nlist), 1, objfile);
  92.     printf ("string = %s\n", string + name_list.n_un.n_strx);
  93.     printf ("Type = 0x%x, value = 0x%08x\n", name_list.n_type, (int)name_list.n_value);
  94.     }
  95.