blob: c677e39d2262cff0c708e361c823493adf28fdd0 [file] [log] [blame]
The Android Open Source Project88b60792009-03-03 19:28:42 -08001/* 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. */
33int 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. */
36int quiet_flag = 0;
37
38int 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