7

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

我用 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

4 回答 4

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

于 2009-05-19T23:56:01.717 回答
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
于 2009-05-20T00:22:48.263 回答
3

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

ld a.out -o myprog
于 2009-05-19T23:45:50.523 回答
1

无论如何都可以重新安装 glibc-devel 并检查它是否有效。这个过程对我有用。

于 2012-01-06T01:22:15.953 回答