从 elf 获取动态符号 table 信息
getting dynamic symbol table information from elf
我正在尝试从 elf 获取动态和静态符号 table 信息。
那是我写的代码:
void symbols(){
int i;
Elf32_Ehdr *header; /* this will point to the header structure */
header = (Elf32_Ehdr *) map_start;
Elf32_Shdr *shdr = (Elf32_Shdr *)(map_start + header->e_shoff);
int shnum = header->e_shnum;
const char * str_p =NULL;
Elf32_Shdr *sh_strtab = &shdr[header->e_shstrndx];
const char *const sh_strtab_p = map_start + sh_strtab->sh_offset;
int j;
int k;
for (i = 0; i < shnum; ++i) {
if ((shdr[i].sh_type == SHT_SYMTAB)||(shdr[i].sh_type==SHT_DYNSYM)){
str_p =(char *) shdr[shdr[i].sh_link].sh_offset;
Elf32_Sym *symboler =(Elf32_Sym *)(map_start + shdr[i].sh_offset);
for(j=0;j<(shdr[i].sh_size/shdr[i].sh_entsize);j++){
printf("%u ", symboler->st_size);
printf("%x ", symboler->st_value);
printf("%u ", symboler->st_shndx);
printf("%s\n",(char *) ((int)map_start+ (int)str_p + symboler->st_name));
symboler++;
}
}
}
}
问题出在动态符号 table,例如:
0 0 0
0 0 0 __gmon_start__
0 0 0 __libc_start_main
0 0 0 fopen
0 0 0 fgetc
0 0 0 printf
0 0 0 atoi
4 80485dc 15 _IO_stdin_used
当我使用 readelf 时,我得到这个名字:
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
2: 00000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.0 (2)
3: 00000000 0 FUNC GLOBAL DEFAULT UND fopen@GLIBC_2.1 (3)
4: 00000000 0 FUNC GLOBAL DEFAULT UND fgetc@GLIBC_2.0 (2)
5: 00000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.0 (2)
6: 00000000 0 FUNC GLOBAL DEFAULT UND atoi@GLIBC_2.0 (2)
7: 080485dc 4 OBJECT GLOBAL DEFAULT 15 _IO_stdin_used
为什么我的版本是 atoi
而 readelf 是 atoi@GLIBC_2.0 (2)
?我该如何解决这个问题?
readelf
显示有关符号版本及其名称的信息。
解释了符号版本控制here。
Symbol versioning - simple explanation
Symbol versioning allows a library to define its exported symbols
through the use of a map file. It also allows one library to
provide multiple versions of the same symbol. In the past,
without symbol versioning, this was accomplished by bumping
the shared library version (libfoo.so.1, libfoo.so.2, etc.).
Now one library version can provide multiple versions of the
same symbol.
有关详细信息,请参阅 this page。
我正在尝试从 elf 获取动态和静态符号 table 信息。
那是我写的代码:
void symbols(){
int i;
Elf32_Ehdr *header; /* this will point to the header structure */
header = (Elf32_Ehdr *) map_start;
Elf32_Shdr *shdr = (Elf32_Shdr *)(map_start + header->e_shoff);
int shnum = header->e_shnum;
const char * str_p =NULL;
Elf32_Shdr *sh_strtab = &shdr[header->e_shstrndx];
const char *const sh_strtab_p = map_start + sh_strtab->sh_offset;
int j;
int k;
for (i = 0; i < shnum; ++i) {
if ((shdr[i].sh_type == SHT_SYMTAB)||(shdr[i].sh_type==SHT_DYNSYM)){
str_p =(char *) shdr[shdr[i].sh_link].sh_offset;
Elf32_Sym *symboler =(Elf32_Sym *)(map_start + shdr[i].sh_offset);
for(j=0;j<(shdr[i].sh_size/shdr[i].sh_entsize);j++){
printf("%u ", symboler->st_size);
printf("%x ", symboler->st_value);
printf("%u ", symboler->st_shndx);
printf("%s\n",(char *) ((int)map_start+ (int)str_p + symboler->st_name));
symboler++;
}
}
}
}
问题出在动态符号 table,例如:
0 0 0
0 0 0 __gmon_start__
0 0 0 __libc_start_main
0 0 0 fopen
0 0 0 fgetc
0 0 0 printf
0 0 0 atoi
4 80485dc 15 _IO_stdin_used
当我使用 readelf 时,我得到这个名字:
0: 00000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
2: 00000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@GLIBC_2.0 (2)
3: 00000000 0 FUNC GLOBAL DEFAULT UND fopen@GLIBC_2.1 (3)
4: 00000000 0 FUNC GLOBAL DEFAULT UND fgetc@GLIBC_2.0 (2)
5: 00000000 0 FUNC GLOBAL DEFAULT UND printf@GLIBC_2.0 (2)
6: 00000000 0 FUNC GLOBAL DEFAULT UND atoi@GLIBC_2.0 (2)
7: 080485dc 4 OBJECT GLOBAL DEFAULT 15 _IO_stdin_used
为什么我的版本是 atoi
而 readelf 是 atoi@GLIBC_2.0 (2)
?我该如何解决这个问题?
readelf
显示有关符号版本及其名称的信息。
解释了符号版本控制here。
Symbol versioning - simple explanation
Symbol versioning allows a library to define its exported symbols through the use of a map file. It also allows one library to provide multiple versions of the same symbol. In the past, without symbol versioning, this was accomplished by bumping the shared library version (libfoo.so.1, libfoo.so.2, etc.). Now one library version can provide multiple versions of the same symbol.
有关详细信息,请参阅 this page。