【问题标题】:linux linking assembly with gcc gives many errorslinux 将程序集与 gcc 链接会产生许多错误
【发布时间】:2012-10-30 12:44:29
【问题描述】:

我正在尝试编译和链接一个简单的“你好,世界!” GCC 的程序。该程序使用“printf”C 函数。我遇到的问题是终端抛出多个错误。我正在运行 Archlinux,使用 NASM 编译,与 GCC 链接。这是我的代码:

; ----------------------------------------------------------------------------
; helloworld.asm
; 
; Compile: nasm -f elf32 helloworld.asm
; Link: gcc helloworld.o
; ----------------------------------------------------------------------------
SECTION .data
    message db "Hello, World",0
SECTION .text
    global  main
    extern  printf

    section .text
_main:
    push    message
    call    printf
    add     esp, 4
    ret

我收到的错误如下:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-unknown-linux-gnu/4.7.2/libgcc.a     when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
collect2: error: ld returned 1 exit status

谁能告诉我是什么导致了这些错误以及我需要做些什么来修复它们?

提前致谢,

莱利H

【问题讨论】:

    标签: gcc assembly x86 nasm


    【解决方案1】:

    对于这样的事情,你应该首先了解gcc到底在做什么。所以使用

     gcc -v helloworld.o -o helloworld
    

    发生的事情是你有一个 64 位的 Linux 并在其中链接了一个 32 位的对象。所以试试

     gcc -m32 -v helloworld.o -o helloworld
    

    但我认为你现在应该避免编码汇编(优化编译器比你可以合理地做的更好)。如果您绝对需要一些汇编指令,请在您的 C 代码中添加一些 asm

    顺便说一句,您可以使用gcc -fverbose-asm -O -wall -S helloworld.c 编译并查看生成的helloworld.s;你也可以将.s文件传递给gcc

    【讨论】:

    • 它输出一大堆垃圾(文件路径等等),然后是我最初发布的相同错误消息。
    • 您可能需要在系统上安装 lib32gcc1gcc-4.7-multilib 软件包。为什么不在 64 位系统上编写 x86-64 汇编代码(不是 x86 32 位汇编)?
    • 我将如何在终端中执行此操作?不好意思,我是第一次新装 Archlinux,对 linux 不太了解。
    • 然后在尝试汇编程序之前了解更多关于 Linux(系统管理和命令行开发)的知识......
    • 非常感谢@BasileStarynkevitch 给出了正确答案。
    猜你喜欢
    • 1970-01-01
    • 2014-05-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    相关资源
    最近更新 更多