我想使用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
这可能有什么问题?
答案 0 :(得分:2)
这里的问题是__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
来设置返回代码。