所以基本上我试图objdump在 Linux 上重新使用一些从 32 位 ELF 二进制文件转储的汇编代码/数据。
所以基本上,在反汇编的二进制文件中,我发现了一些引用.bss像这样的部分的符号:
80486b7: mov 0x804b264,%eax <- 0x804b264 is an addr in .bss
80486bc: movl $0x0,0x4(%esp)
80486c3:
80486c4: mov %eax,(%esp)
80486c7: call 804876c <sum>
通过深入研究原始源代码,我发现它0x804b264用于stdinin.bss部分。
恕我直言,.bss节的数据基本上有两种情况:
未初始化的数据,将在源代码中未初始化
一些全局/系统相关的数据(如上述情况下的stdin)
因此,在尝试重新使用.bss部分数据时,我尝试过这种方式:
.section .bss
S_0x804B260 : .byte 0x00
.byte 0x00
.byte 0x00
.byte 0x00
S_0x804B264 : .byte 0x00 <- I lift addr into symbol!
.byte 0x00
.byte 0x00
.byte 0x00
.byte 0x00
在本.text节中,我也会将相应的地址提升为符号。
同样的情况适用于.rodata和.data部分
但问题是,有一些全局变量(例如stdin stdout),定位在.bsssection 中,而没有被用户定义的代码初始化,这意味着在我重用的 asm 代码中,这个符号变量将始终为零!
我尝试手动替换与stdin对应的符号,看起来它工作正常。
但问题是:
如何识别该
.bss部分中的哪个符号是系统初始化的某些变量?例如stdin、stdout*等?如果这是不可能的,那么无论如何我可以强制系统
.bss在我希望它使用的部分中使用内存?
我清楚吗?谁能给我一些帮助?