编译程序集时链接器错误

时间:2013-05-30 04:47:47

标签: assembly

我正在尝试为简单的hello world程序生成汇编语言列表

我跑了gcc -S file.c

并生成了file.s。

我使用生成的.s文件使用以下脚本:

#!/bin/bash -x

NAME=file1

for i in *.s; do
        as -o ${i%.s}.o $i
done
ld -static -o $NAME *.o
objdump -D $NAME

当我使用它时,我收到一个错误:

In function `main':
(.text+0x16): undefined reference to `printf'

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

使用gcc -fverbose-asm -S -Wall进行编译(也可能-O-O2

-fverbose-asm在汇编程序中生成一些有用的注释。

使用gcc -v了解程序的链接方式。您需要启动代码(例如某些crt0.o),您需要至少链接libc.so.6libc.a

在编译和链接gcc -v时,会显示中间步骤以及隐式对象文件和库。 gcc刚刚启动其他程序,如cc1(编译器本身)和as(汇编程序)和ld链接程序。有时collect2是一种链接器。

顺便说一下,您可以编写一些汇编代码并通过gcc使用它。例如,代码只是汇编中的一个例程,其余代码在C中。然后运行gcc -v -Wall routine.s main.c -o prog

另请阅读Linux Assembly HowTo