【问题标题】:Linking with ld/gcc doesn't produce same result (error/sucess)与 ld/gcc 链接不会产生相同的结果(错误/成功)
【发布时间】:2014-05-28 12:06:12
【问题描述】:

我有一个问题,编译后我不想使用 ld 链接,但是当我这样做时出现错误,让我们看看我做了什么:

make i386
gcc -g -c -I. -I/usr/include -o p_test.o.i386 pkcs11test.c
ld -o p_test.i386 p_test.o.i386 -g -ldl     
ld: p_test.o.i386: référence au symbole non défini «fflush@@GLIBC_2.0»
//lib/i386-linux-gnu/libc.so.6: error adding symbols: DSO missing from command line
make: *** [i386_p_test] Erreur 1

所以使用 ld 我得到了这个错误,但是当我尝试使用 gcc 时

make i386
gcc -g -c -I. -I/usr/include -o p_test.o.i386 pkcs11test.c
gcc -o p_test.i386 p_test.o.i386 -g -ldl

我没有错误,我的可执行文件

你知道如何让 ld 用于链接我的程序吗?

谢谢!

【问题讨论】:

    标签: c linux gcc linker ld


    【解决方案1】:

    当你用gcc -o p_test.i386 p_test.o.i386 -g -ldl 启动gcc 时,它实际上在ld 命令中添加了很多内部库。您可以通过将-v 选项添加到 gcc 来查看所有参数。 “内部库”之一是 glibc 本身 (-lc)。

    例如,这里GCC verbose mode output explanation 我们可以看到collect2 用于链接可执行文件的程序。运行中添加了 -lgcc -lgcc_eh -lc -lgcc -lgcc_eh 库,并且还链接了几个 CRT 运行时对象:

    /usr/lib/gcc-lib/i686/3.3.1/collect2
     --eh-frame-hdr -m elf_i386 -dynamic-linker
     /lib/ld-linux.so.2 /usr/lib/crt1.o /usr/lib/crti.o
     /usr/lib/gcc-lib/i686/3.3.1/crtbegin.o
     -L/usr/lib/gcc-lib/i686/3.3.1
     -L/usr/lib/gcc-lib/i686/3.3.1/../../..
      /tmp/ccQynbTm.o  # << this is input file.
     -lgcc -lgcc_eh -lc -lgcc -lgcc_eh
     /usr/lib/gcc-lib/i686/3.3.1/crtend.o
     /usr/lib/crtn.o
    

    PS:我认为最好不要更改文件扩展名(后缀)。您的p_test.o.i386 可以重命名为p_test.i386.o

    【讨论】:

      猜你喜欢
      • 2014-12-03
      • 1970-01-01
      • 1970-01-01
      • 2010-09-11
      • 1970-01-01
      • 1970-01-01
      • 2020-02-09
      • 2017-06-10
      • 2012-10-30
      相关资源
      最近更新 更多