我正在查看debug/gosym包,它的类型是gosym.Table,据说是Go可执行文件的符号表。不幸的是,我看不到任何从正在运行的程序中提取sysmbol表的方法(Go反射是缺乏的,我需要比它所能提供的更多的信息,特别是导出符号的名称)。
如果这通常是不可能的,但可以在Linux / for ELF二进制文件上完成,这也是一个选择。
我正在尝试编写一些ELF解析逻辑(用C语言)。具体来说,我试图识别GOT中的哪些条目对应于哪个函数。
我已经构建了一个简单的程序,其中包含了对malloc和free的引用。readelf -a a.out的相关摘录
Relocation section '.rela.plt' at offset 0x630 contains 2 entries:
Offset Info Type Symbol's Value Symbol's Name + Addend
00000000000
我有一个简单的程序集文件main.s,它包含:
mysymbol1=1234
我使用以下命令将其组装成一个对象文件:
$ arm-none-eabi-as main.s -o main.o
现在我检查符号表
$ arm-none-eabi-objdump -t main.o
main.o: file format elf32-littlearm
SYMBOL TABLE:
00000000 l d .text 00000000 .text
00000000 l d .data 00000000 .data
00000000 l d .bss 0000
我想学习elf文件,但当我想到全局变量、全局静态变量和作用域静态变量时,我会有一些困惑。例如:
int a = 2;
int b;
static int c = 4;
static int d;
void fun(){
static int e = 6;
static int f;
}
int main(void){
fun();
}
谁能说出每个变量属于哪个段呢?在我看来,b,d和f属于.bss段,a,c和e属于数据段,但是我不知道elf文件中全局静态变量和全局变量的区别。
假设如下所示:
Elf_Section_Header *sectionHeaderTable //points to the start of a ELF section header table
Elf_Section_Header *symtabHeader //points to the start of the symtab section header
为什么下面的内容不指向相关的字符串表部分标题?
Elf_Section_Header *strTabSectionHeader = (Elf_Section_Header *)((char *)sectionHeaderTable