1

我想使用 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  

这里可能有什么问题?

4

1 回答 1

3

这里的问题是,这__bss_start将是进程地址空间中的 32 位地址,而您正试图将其放入 16 位寄存器中。你快到了(事实上,你的堆栈清理add esp,8是正确的!),但你需要三个修改:

  1. mov bx, __bss_start需要mov ebx, __bss_start(32 位宽)。
  2. push bx需要push ebx, 再次为 32 位宽。
  3. 我修改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设置返回码。

于 2013-07-09T10:09:29.443 回答