| /* TODO: |
| 1. check the ARM EABI version--this works for versions 1 and 2. |
| 2. use a more-intelligent approach to finding the symbol table, symbol-string |
| table, and the .dynamic section. |
| 3. fix the determination of the host and ELF-file endianness |
| 4. write the help screen |
| */ |
| |
| #include <stdio.h> |
| #include <common.h> |
| #include <debug.h> |
| #include <libelf.h> |
| #include <libebl.h> |
| #ifdef ARM_SPECIFIC_HACKS |
| #include <libebl_arm.h> |
| #endif/*ARM_SPECIFIC_HACKS*/ |
| #include <elf.h> |
| #include <gelf.h> |
| #include <string.h> |
| #include <errno.h> |
| #include <string.h> |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #include <fcntl.h> |
| #include <unistd.h> |
| #include <rangesort.h> |
| #include <prelink_info.h> |
| #include <libgen.h> |
| |
| |
| /* Flag set by --verbose. This variable is global as it is accessed by the |
| macro INFO() in multiple compilation unites. */ |
| int verbose_flag = 0; |
| /* Flag set by --quiet. This variable is global as it is accessed by the |
| macro PRINT() in multiple compilation unites. */ |
| int quiet_flag = 0; |
| |
| int main(int argc, char **argv) { |
| |
| argc--, argv++; |
| if (!argc) |
| return 0; |
| |
| /* Check to see whether the ELF library is current. */ |
| FAILIF (elf_version(EV_CURRENT) == EV_NONE, "libelf is out of date!\n"); |
| |
| const char *filename; |
| for (; argc; argc--) { |
| filename = *argv++; |
| |
| Elf *elf; |
| GElf_Ehdr elf_hdr; |
| int fd; |
| int prelinked; |
| long prelink_addr = 0; |
| |
| INFO("Processing file [%s]\n", filename); |
| |
| fd = open(filename, O_RDONLY); |
| FAILIF(fd < 0, "open(%d): %s (%d).\n", |
| filename, |
| strerror(errno), |
| errno); |
| |
| elf = elf_begin(fd, ELF_C_READ_MMAP_PRIVATE, NULL); |
| FAILIF_LIBELF(elf == NULL, elf_begin); |
| |
| FAILIF_LIBELF(0 == gelf_getehdr(elf, &elf_hdr), |
| gelf_getehdr); |
| |
| #ifdef SUPPORT_ANDROID_PRELINK_TAGS |
| prelinked = check_prelinked(filename, elf_hdr.e_ident[EI_DATA] == ELFDATA2LSB, |
| &prelink_addr); |
| #else |
| #error 'SUPPORT_ANDROID_PRELINK_TAGS is not defined!' |
| #endif |
| |
| if (prelinked) |
| PRINT("%s: 0x%08x\n", filename, prelink_addr); |
| else |
| PRINT("%s: not prelinked\n", filename); |
| |
| FAILIF_LIBELF(elf_end(elf), elf_end); |
| close(fd); |
| } |
| |
| return 0; |
| } |
| |