gcc-Hello.s 问题

gcc-Hello.s 问题

我的系统是 Ubuntu 18.04 64位。 已安装 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... 嗯,我认为这是最后的手段。

有什么建议么?

答案1

对于任何感兴趣的人。(对于像我这样的新手来说并不那么简单:))实际上可以在编译器之间进行选择!所以:

gcc-4.8 Hello.s

就是答案。

相关内容