我的系统是 Ubuntu 18.04 64bit 。 安装了 build-essentials 和 devtools。
你好,我有一个名为 Hello.s 的程序集文件,内容如下:
#This is a simple "Hello World!" program
.section .rodata #read only data section
str: .string "Hello World!\n"
########
.text #the beginnig of the code
.globl main #the label "main" is used to state the initial point of this program
.type main, @function # the label "main" representing the beginning of a function
main: # the main function:
pushq %rbp #save the old frame pointer
movq %rsp, %rbp #create the new frame pointer
movq $str,%rdi #the string is the only paramter passed to the printf function (remember- first parameter goes in %rdi).
movq $0,%rax
call printf #calling to printf AFTER we passed its parameters.
#return from printf:
movq $0, %rax #return value is zero (just like in c - we tell the OS that this program finished seccessfully)
movq %rbp, %rsp #restore the old stack pointer - release all used memory.
popq %rbp #restore old frame pointer (the caller function frame)
ret #return to caller function (OS)
尝试使用 gcc -Hello.s 编译它会返回以下消息:
/usr/bin/ld: /tmp/ccY9hdWi.o: relocation R_X86_64_32S against `.rodata' can not be used when making a PIE object; recompile with -fPIC
/usr/bin/ld:最终链接失败:输出 collect2 上的不可表示部分:错误:ld 返回 1 退出状态
尝试了没有效果的 gcc -fPIC Hello.s - 带来了相同的消息。
有人告诉我安装gcc-4.8,那没用
还建议安装以前版本的 ubuntu.. 在我看来,这是最后的手段。
有什么建议么?
对于任何有兴趣的人。(对于像我这样的新手来说不是那么简单:))实际上可以在编译器之间进行选择!所以:
是答案。