28 |
|
|
29 |
|
|
30 |
#include <elf.h> |
#include <elf.h> |
31 |
Elf32_Phdr pheader; |
ElfW(Phdr) pheader; |
32 |
Elf32_Ehdr eheader; |
ElfW(Ehdr) eheader; |
33 |
Elf32_Sym *symbol_table; |
ElfW(Sym) *symbol_table; |
34 |
int text_index,data_index,bss_index,sbss_index; |
int text_index,data_index,bss_index,sbss_index; |
35 |
#undef SYM_NAME |
#undef SYM_NAME |
36 |
#undef EXT_and_TEXT_BSS_DAT |
#undef EXT_and_TEXT_BSS_DAT |
37 |
|
#define mjoin(a,b) a ## b |
38 |
|
#define Mjoin(a,b) mjoin(a,b) |
39 |
|
#define ELFW(a) Mjoin(ELF,Mjoin(__ELF_NATIVE_CLASS,Mjoin(_,a))) |
40 |
|
|
41 |
int nsyms; |
int nsyms; |
42 |
char *my_string_table; |
char *my_string_table; |
73 |
output_externals(char *); |
output_externals(char *); |
74 |
|
|
75 |
int |
int |
76 |
main(argc,argv) |
main(argc,argv,envp) |
77 |
int argc ; |
int argc ; |
78 |
char *argv[]; |
char *argv[],*envp[]; |
79 |
{ |
{ |
80 |
if (argc!=3) {perror("bad arg count"); |
if (argc!=3) {perror("bad arg count"); |
81 |
fflush(stdout); |
fflush(stdout); |
89 |
} |
} |
90 |
#define SECTION_H(k) section_headers[k] |
#define SECTION_H(k) section_headers[k] |
91 |
char *section_names; |
char *section_names; |
92 |
Elf32_Shdr *section_headers; |
ElfW(Shdr) *section_headers; |
93 |
|
|
94 |
int |
int |
95 |
get_section_number(name) |
get_section_number(name) |
154 |
fprintf(stderr,"Bad magic %s",filename); |
fprintf(stderr,"Bad magic %s",filename); |
155 |
exit(1);}; |
exit(1);}; |
156 |
|
|
157 |
section_headers = (void *)malloc(sizeof(Elf32_Shdr)* |
section_headers = (void *)malloc(sizeof(ElfW(Shdr))* |
158 |
(1+ eheader.e_shnum)); |
(1+ eheader.e_shnum)); |
159 |
fseek(fp,eheader.e_shoff,0); |
fseek(fp,eheader.e_shoff,0); |
160 |
for (i=0 ; i< eheader.e_shnum ; i++) |
for (i=0 ; i< eheader.e_shnum ; i++) |
165 |
symsize = SECTION_H(symbol_index).sh_entsize; |
symsize = SECTION_H(symbol_index).sh_entsize; |
166 |
nsyms= SECTION_H(symbol_index).sh_size/symsize; |
nsyms= SECTION_H(symbol_index).sh_size/symsize; |
167 |
symbol_table |
symbol_table |
168 |
= (void *) malloc(sizeof(Elf32_Sym) * nsyms); |
= (void *) malloc(sizeof(ElfW(Sym)) * nsyms); |
169 |
/* |
/* |
170 |
sizeof(struct syment) and SYMESZ are not always the same. |
sizeof(struct syment) and SYMESZ are not always the same. |
171 |
*/ |
*/ |
188 |
|
|
189 |
struct lsymbol_table tab; |
struct lsymbol_table tab; |
190 |
|
|
191 |
#define EXT_and_TEXT_BSS_DAT(p) (((ELF32_ST_BIND(p->st_info) == STB_GLOBAL) \ |
#define EXT_and_TEXT_BSS_DAT(p) (((ELFW(ST_BIND)(p->st_info) == STB_GLOBAL) \ |
192 |
|| (ELF32_ST_BIND(p->st_info) == STB_WEAK) \ |
|| (ELFW(ST_BIND)(p->st_info) == STB_WEAK) \ |
193 |
) \ |
) \ |
194 |
&& \ |
&& \ |
195 |
(p->st_shndx == text_index \ |
(p->st_shndx == text_index \ |
199 |
|| p->st_shndx == SHN_UNDEF \ |
|| p->st_shndx == SHN_UNDEF \ |
200 |
)) |
)) |
201 |
#define SYM_NAME(p) my_string_table+(p->st_name) |
#define SYM_NAME(p) my_string_table+(p->st_name) |
202 |
#define STRUCT_SYMENT Elf32_Sym |
#define STRUCT_SYMENT ElfW(Sym) |
203 |
#define n_value st_value |
#define n_value st_value |
204 |
|
|
205 |
|
|
283 |
|
|
284 |
return 0; |
return 0; |
285 |
} |
} |
|
|
|
|
|
|
|
|
|