Home | History | Annotate | Download | only in isprelinked
      1 /* TODO:
      2    1. check the ARM EABI version--this works for versions 1 and 2.
      3    2. use a more-intelligent approach to finding the symbol table, symbol-string
      4       table, and the .dynamic section.
      5    3. fix the determination of the host and ELF-file endianness
      6    4. write the help screen
      7 */
      8 
      9 #include <stdio.h>
     10 #include <common.h>
     11 #include <debug.h>
     12 #include <libelf.h>
     13 #include <libebl.h>
     14 #ifdef ARM_SPECIFIC_HACKS
     15     #include <libebl_arm.h>
     16 #endif/*ARM_SPECIFIC_HACKS*/
     17 #include <elf.h>
     18 #include <gelf.h>
     19 #include <string.h>
     20 #include <errno.h>
     21 #include <string.h>
     22 #include <sys/types.h>
     23 #include <sys/stat.h>
     24 #include <fcntl.h>
     25 #include <unistd.h>
     26 #include <rangesort.h>
     27 #include <prelink_info.h>
     28 #include <libgen.h>
     29 
     30 
     31 /* Flag set by --verbose.  This variable is global as it is accessed by the
     32    macro INFO() in multiple compilation unites. */
     33 int verbose_flag = 0;
     34 /* Flag set by --quiet.  This variable is global as it is accessed by the
     35    macro PRINT() in multiple compilation unites. */
     36 int quiet_flag = 0;
     37 
     38 int main(int argc, char **argv) {
     39 
     40     argc--, argv++;
     41     if (!argc)
     42         return 0;
     43 
     44     /* Check to see whether the ELF library is current. */
     45     FAILIF (elf_version(EV_CURRENT) == EV_NONE, "libelf is out of date!\n");
     46 
     47     const char *filename;
     48     for (; argc; argc--) {
     49         filename = *argv++;
     50 
     51         Elf *elf;
     52         GElf_Ehdr elf_hdr;
     53         int fd;
     54         int prelinked;
     55         long prelink_addr = 0;
     56 
     57         INFO("Processing file [%s]\n", filename);
     58 
     59         fd = open(filename, O_RDONLY);
     60         FAILIF(fd < 0, "open(%d): %s (%d).\n",
     61                filename,
     62                strerror(errno),
     63                errno);
     64 
     65         elf = elf_begin(fd, ELF_C_READ_MMAP_PRIVATE, NULL);
     66         FAILIF_LIBELF(elf == NULL, elf_begin);
     67 
     68         FAILIF_LIBELF(0 == gelf_getehdr(elf, &elf_hdr),
     69                       gelf_getehdr);
     70 
     71 #ifdef SUPPORT_ANDROID_PRELINK_TAGS
     72         prelinked = check_prelinked(filename, elf_hdr.e_ident[EI_DATA] == ELFDATA2LSB,
     73                                     &prelink_addr);
     74 #else
     75         #error 'SUPPORT_ANDROID_PRELINK_TAGS is not defined!'
     76 #endif
     77 
     78         if (prelinked)
     79             PRINT("%s: 0x%08x\n", filename, prelink_addr);
     80         else
     81             PRINT("%s: not prelinked\n", filename);
     82 
     83         FAILIF_LIBELF(elf_end(elf), elf_end);
     84         close(fd);
     85     }
     86 
     87     return 0;
     88 }
     89 
     90