使用GNU链接器时“文件无法识别”

时间:2009-05-19 23:40:03

标签: linker-errors gnu-toolchain

我可能做错了什么,做个新手。你能帮帮我吗?

我在C中编写了一个名为hello.c的简单Hello World程序,并运行以下命令:

gcc -S hello.c

那产生了hello.s。然后我将该文件与GNU汇编程序as

一起使用
as hello.s

哪个产生了一个不可执行的a.out,仍然需要链接,我明白了吗?

我尝试使用ld链接它,如下所示:

ld a.out

但是得到以下错误:

a.out: file not recognized: File truncated

ld删除了我的文件。

这是一个x86 Ubuntu系统。我究竟做错了什么?非常感谢!

4 个答案:

答案 0 :(得分:6)

我的第一个问题是:你为什么要汇编代码?如果你想要汇编程序代码,请务必使用gcc -S来获取它(我猜是为了查看)。

但是你不需要通过as来继续运行,只需使用:

gcc -o hello hello.c
gcc -S hello.c

第一步将C源直接转换为可执行文件,第二步将为您提供汇编源。

您的具体问题可能是ld尝试将其输出写入a.out。如果这也是您的输入文件,它可能会在运行ld的过程中被销毁。您可以尝试在运行ld命令之前将a.out重命名为a.inld a.in

答案 1 :(得分:5)

我是这样做的:

> gcc -S forums.c 
> as forums.s -o forums.o
> gcc forums.o -o forums
> ./forums 
test

为什么要调用gcc而不是ld?因为GCC负责链接C运行时,并执行其他依赖于实现的内容。如果您想查看,请使用--verbose选项:

> gcc --verbose forums.o -o forums
Using built-in specs.
Target: i686-pc-linux-gnu
Configured with: ../configure --prefix=/usr --enable-shared --enable-languages=c,c++,fortran,objc,obj-c++ --enable-threads=posix --mandir=/usr/share/man --infodir=/usr/share/info --enable-__cxa_atexit --disable-multilib --libdir=/usr/lib --libexecdir=/usr/lib --enable-clocale=gnu --disable-libstdcxx-pch --with-tune=generic
Thread model: posix
gcc version 4.4.0 (GCC) 
COMPILER_PATH=/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/
LIBRARY_PATH=/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/:/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../:/lib/:/usr/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'forums' '-mtune=generic'
 /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/collect2 --eh-frame-hdr -m elf_i386 --hash-style=both -dynamic-linker /lib/ld-linux.so.2 -o forums /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crt1.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crti.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/crtbegin.o -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0 -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0 -L/usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../.. forums.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/crtend.o /usr/lib/gcc/i686-pc-linux-gnu/4.4.0/../../../crtn.o

答案 2 :(得分:3)

编辑:好的,我在我的系统上尝试了这一切,我想我知道问题是什么。 ld正在写入a.out(其默认输出文件),同时从中读取。尝试这样的事情:

ld a.out -o myprog

答案 3 :(得分:1)

无论如何,

重新安装glibc-devel并检查它是否有效。这个过程对我有用。