我想使用 CONSTANT __bss_start 打印 bss start 的地址。我制作了一个简单的程序,它将打印 bss 部分的地址。下面是代码
section .bss
section .data
x db "value is =%ld"
section .text
;extern alt_u32* __bss_start;
global main
extern __bss_start;
extern printf
main:
mov bx,__bss_start
push bx
push x
call printf
add esp,8
ret
当我运行 gcc -m32 -o bss_start.o 以获得最终可执行文件时,出现以下错误
bss_start.asm:(.text+0x2): relocation truncated to fit: R_386_16 against symbol `__bss_start' defined in *ABS* section in bss
这里可能有什么问题?
最佳答案
这里的问题是 __bss_start
将是进程地址空间中的 32 位地址,并且您试图将其放入 16 位寄存器中。您已经快完成了(事实上,您的堆栈清理 add esp,8
完全正确!),但您需要进行三项修改:
-
mov bx, __bss_start
需要是mov ebx, __bss_start
(32 位宽)。 -
push bx
需要是push ebx
,同样是 32 位宽。 - 我修改了
x db value is =%ld
至x db value is=%x
这样我就可以根据objdump -t
检查输出.
这为我提供了 objdump 的匹配值。
另外,为了额外的好处,我通过添加以下内容让 C 运行时库自行清理:
xor eax, eax
push eax
call exit
带有 extern exit
。但你不需要这个,但是,我会 xor eax,eax
设置返回码。
关于assembly - 在汇编中获取 _bss_start 时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17545009/