Ubuntu9.10 gcc as ld编译Hello world 不能生成执行文件

wengwen89 2009-12-23 06:13:10
Ubuntu9.10上 终端中
//***************************
//C语言程序 文件名为ctest.c
//程序
#include <stdio.h>
int main()
{
printf("Hello world!\n");
return 0 ;
}
//***************************
用gcc -S ctest.c
产生ctest.s文件
//****************************
.file "ctest.c"
.section .rodata
.LC0:
.string "Hello world!"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movl $.LC0, (%esp)
call puts
movl $0, %eax
leave
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.4.1-4ubuntu8) 4.4.1"
.section .note.GNU-stack,"",@progbits
//***************************************************
然后 as -o ctest.o ctest.s
生成ctest.o
然后 ld -o ctest ctest.o
接着就出现以下提示:
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048074
ctest.o: In function `main':
ctest.c:(.text+0x11): undefined reference to `puts'
没产生执行文件ctest




问题出现在哪里
...全文
278 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yh_no_code 2012-06-18
  • 打赏
  • 举报
回复
楼主,不是特别的要求的话,最好不要手动是用ld去链接,链接是要很多的库的,我原来也想过这个问题,到处找资料,总结如下:(随便说一下,楼主你的结帖率让我迟疑了,要不要回答,最后还是回了吧!请记得结贴)

4.手动进行链接。当输入ld -o hello hello.o 的时候出现错误了。我的错误如下:



yanghui@ubuntu:~/project/c/test$ ld -o ld1 ld1.o

ld: warning: cannot find entry symbol _start; defaulting to 0000000008048074

ld1.o: In function `main':

ld.c:(.text+0x11): undefined reference to `puts'



5.可以看出是某一个东西没有链接进来,有一些没有定义,这个错误应该是不陌生的。可以知道,我们所做得工作没有做完,这个时候可以看看gcc是怎样做的。在中断中输入 gcc -o ld1 ld.c -v ,我的机器显示如下:



yanghui@ubuntu:~/project/c/test$ gcc -o ld1 ld.c -v

Using built-in specs.

Target: i686-linux-gnu

Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.4.4-14ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.4/README.Bugs ;--enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.4 --enable-shared --enable-multiarch --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.4 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-objc-gc --enable-targets=all --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=i686-linux-gnu --host=i686-linux-gnu --target=i686-linux-gnu

Thread model: posix

gcc version 4.4.5 (Ubuntu/Linaro 4.4.4-14ubuntu5)

COLLECT_GCC_OPTIONS='-o' 'ld1' '-v' '-mtune=generic' '-march=i686'

/usr/lib/gcc/i686-linux-gnu/4.4.5/cc1 -quiet -v ld.c -D_FORTIFY_SOURCE=2 -quiet -dumpbase ld.c -mtune=generic -march=i686 -auxbase ld -version -fstack-protector -o /tmp/ccTCwU6b.s

ignoring nonexistent directory "/usr/local/include/i686-linux-gnu"

ignoring nonexistent directory "/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../i686-linux-gnu/include"

ignoring nonexistent directory "/usr/include/i686-linux-gnu"

#include "..." search starts here:

#include <...> search starts here:

/usr/local/include

/usr/lib/gcc/i686-linux-gnu/4.4.5/include

/usr/lib/gcc/i686-linux-gnu/4.4.5/include-fixed

/usr/include

End of search list.

GNU C (Ubuntu/Linaro 4.4.4-14ubuntu5) version 4.4.5 (i686-linux-gnu)

compiled by GNU C version 4.4.5, GMP version 4.3.2, MPFR version 3.0.0-p3.

GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072

Compiler executable checksum: 2c79c9815376ef8d35d3f163ae436fce

COLLECT_GCC_OPTIONS='-o' 'ld1' '-v' '-mtune=generic' '-march=i686'

as -V -Qy -o /tmp/ccWOZTRc.o /tmp/ccTCwU6b.s

GNU assembler version 2.20.51 (i686-linux-gnu) using BFD version (GNU Binutils for Ubuntu) 2.20.51-system.20100908

COMPILER_PATH=/usr/lib/gcc/i686-linux-gnu/4.4.5/:/usr/lib/gcc/i686-linux-gnu/4.4.5/:/usr/lib/gcc/i686-linux-gnu/:/usr/lib/gcc/i686-linux-gnu/4.4.5/:/usr/lib/gcc/i686-linux-gnu/:/usr/lib/gcc/i686-linux-gnu/4.4.5/:/usr/lib/gcc/i686-linux-gnu/

LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.4.5/:/usr/lib/gcc/i686-linux-gnu/4.4.5/:/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/:/lib/../lib/:/usr/lib/../lib/:/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../:/lib/:/usr/lib/:/usr/lib/i686-linux-gnu/

COLLECT_GCC_OPTIONS='-o' 'ld1' '-v' '-mtune=generic' '-march=i686'

/usr/lib/gcc/i686-linux-gnu/4.4.5/collect2 --build-id --eh-frame-hdr -m elf_i386 --hash-style=gnu -dynamic-linker /lib/ld-linux.so.2 -o ld1 -z relro /usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o /usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crti.o /usr/lib/gcc/i686-linux-gnu/4.4.5/crtbegin.o -L/usr/lib/gcc/i686-linux-gnu/4.4.5 -L/usr/lib/gcc/i686-linux-gnu/4.4.5 -L/usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib -L/lib/../lib -L/usr/lib/../lib -L/usr/lib/gcc/i686-linux-gnu/4.4.5/../../.. -L/usr/lib/i686-linux-gnu /tmp/ccWOZTRc.o -lgcc --as-needed -lgcc_s --no-as-needed -lc -lgcc --as-needed -lgcc_s --no-as-needed /usr/lib/gcc/i686-linux-gnu/4.4.5/crtend.o /usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crtn.o



6.这个时候可以看到,红色子的后面还有很多的库,我们的工作很显然是要将这些库文件链接进来,链接的时候需要使用-lc的参数,具体在gcc的帮助文档有详细的介绍。提取的库文件如下:



--eh-frame-hdr -m elf_i386 --hash-style=gnu -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o /usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crti.o /usr/lib/gcc/i686-linux-gnu/4.4.5/crtbegin.o /usr/lib/gcc/i686-linux-gnu/4.4.5/crtend.o /usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crtn.o



7.链接操作如下:

yanghui@ubuntu:~/project/c/test$ ld -o hello --eh-frame-hdr -m elf_i386 --hash-style=gnu -dynamic-linker /lib/ld-linux.so.2 /usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crt1.o /usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crti.o /usr/lib/gcc/i686-linux-gnu/4.4.5/crtbegin.o /usr/lib/gcc/i686-linux-gnu/4.4.5/crtend.o /usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/crtn.o hello.o.o -lc

显示链接成功



8.测试

yanghui@ubuntu:~/project/c/test$ ./hello

Hello World



其实这么做是没有必要的,只是出现了问题想要看个究竟罢了!
pingdan32 2012-06-11
  • 打赏
  • 举报
回复
很明显缺少需要的链接库···在gas时将需要的库一同链接进去就行。
至于是那个库,那看你main中使用了哪些库函数,google一下就知
道了。
lukoy 2012-06-07
  • 打赏
  • 举报
回复
试试:
ld -e main -dynamic-linker /lib/ld-linux.so.2 -o ctest -lc ctest.o
大熊猫侯佩 2009-12-28
  • 打赏
  • 举报
回复
干嘛用as先转成asm,直接gcc xxx.c。
thesecretblue 2009-12-28
  • 打赏
  • 举报
回复
学习了
bheric87 2009-12-27
  • 打赏
  • 举报
回复
你需要在在编译的时候加上库文件*.o.(goole下是哪个),否则gas不认识main和puts.
或者直接gcc -o ctest ctest.s

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧