Arch Linux x86-64(4.2.3-1-ARCH)
gcc(GCC)5.2.0
gcc -Wall -g -o asm_printf asm_printf.s
/usr/bin/ld: /tmp/cct4fa.o: Relocation R_X86_64_32S against '.data' can not be used when making a shared object; recompile with -fPIC /tmp/cct4fa.o:err adding symbols: Bad value collect2: error: ld returned 1 exit status
.section .data msg: .asciz "Printf In Assembly!!\n" .section .text .globl main main: pushq $msg call printf addq $8 %esp pushq $0 call exit
我尝试使用gcc
使用上面命令部分中的命令编译上述代码部分中的程序,最后出现错误错误部分。
注意我不编译共享库。
答案 0 :(得分:1)
特定错误是由push
指令仅支持32位立即数,并且您尝试将其用于64位地址。
然而,整个代码是错误的。目前还不清楚你是否需要32位或64位代码。大多数代码似乎是32位,除了pushq
,所以我假设你真的想要32位代码。为此,将所有这些更改为push
(无论如何这是一个好主意)并使用gcc -m32
进行编译。此外,您只需要从堆栈中删除4个字节,因此请使用addl $4, %esp
。 (感谢 @Employed Russian 指出这一点。)
64位调用约定与32位不同,因此要创建64位版本,必须进行更多更改。因为我假设你真的想要32位,这里仅供参考:
.section .data
msg:
.asciz "Printf In Assembly!!\n"
.section .text
.globl main
main:
subq $8, %rsp
leaq msg(%rip), %rdi
xor %al, %al
call printf
xor %edi, %edi
call exit