在汇编中获取_bss_start的麻烦

时间:2013-07-09 09:42:01

标签: assembly x86

我想使用CONSTANT __bss_start打印bss start的地址。我做了一个简单的程序,它将打印bss section的地址。下面是代码

 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  

这可能有什么问题?

1 个答案:

答案 0 :(得分:2)

这里的问题是__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检查输出。
  4. 这给了我一个与objdump匹配的值。

    此外,只是为了额外的果汁,我得到了C运行时库,以后通过添加:

    来自我清理
    xor eax, eax
    push eax
    call exit
    

    extern exit。但是你不需要这个,但我会xor eax,eax来设置返回代码。