OSDN Git Service

original
[gb-231r1-is01/GB_2.3_IS01.git] / build / tools / isprelinked / isprelinked.c
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