即使在Ubuntu 12.10上没有破坏libgcc_s.so链接,ld也找不到lgcc_s

时间:2013-06-01 11:47:58

标签: gcc static-linking ubuntu-12.10

我遇到了一个问题,编译时gcc编译了-static-static-libgcc标志为编译器启用,并且在Ubuntu 12.10上为链接器启用了-Wl,-static标志。但是应用程序可以通过动态链接(不使用这些标志)来构建。

/usr/bin/ld: cannot find -lgcc_s

在通过互联网查看建议后,我发现大多数情况下,从/usr/lib/gcc/i686-linux-gnu/x.x/libgcc_s.so/lib/libgcc_s.so.1的链接断开是一个问题。但在我的情况下,/usr/lib/gcc/i686-linux-gnu/4.7/libgcc_s.so指的是确实存在的/lib/i386-linux-gnu/libgcc_s.so.1

$ ls -l /usr/lib/gcc/i686-linux-gnu/4.7/libgcc_s.so
lrwxrwxrwx 1 root root 33 Sep 21  2012 /usr/lib/gcc/i686-linux-gnu/4.7/libgcc_s.so -> /lib/i386-linux-gnu/libgcc_s.so.1
$ ls -l /lib/i386-linux-gnu/libgcc_s.so.1
-rw-r--r-- 1 root root 116244 Sep 21  2012 /lib/i386-linux-gnu/libgcc_s.so.1
$ file /lib/i386-linux-gnu/libgcc_s.so.1
/lib/i386-linux-gnu/libgcc_s.so.1: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, BuildID[sha1]=0x61fa08eda0f264222649f9481f9e0340567d0862, stripped

ldconfig的输出显示以下内容:

$ sudo /sbin/ldconfig -v | grep libgcc_s
/sbin/ldconfig.real: Can't stat /lib/i686-linux-gnu: No such file or directory
/sbin/ldconfig.real: Can't stat /usr/lib/i686-linux-gnu: No such file or directory
/sbin/ldconfig.real: Path `/lib/i386-linux-gnu' given more than once
/sbin/ldconfig.real: Path `/usr/lib/i386-linux-gnu' given more than once
    libgcc_s.so.1 -> libgcc_s.so.1
/sbin/ldconfig.real: Cannot stat /usr/lib/i386-linux-gnu/libsoftokn3.so: No such file or directory
/sbin/ldconfig.real: Cannot stat /usr/lib/i386-linux-gnu/libnss_db.so: No such file or directory

任何人都可以通过静态链接帮我解决这个问题吗?如果需要进一步的细节,也请告诉我。感谢。

1 个答案:

答案 0 :(得分:4)

您的链接器可能无法找到libgcc_s.alibgcc_s.so的静态版本。

尝试将-Wl,--verbose=99传递给链接器,看看会出现什么。

前一段时间我遇到过类似的问题。使用链接器选项给出了答案:

...
attempt to open /long_path/usr/lib/libgcc_s.so failed
attempt to open /long_path/usr/lib/libgcc_s.a failed
attempt to open /long_path/lib/libgcc_s.a failed
attempt to open /long_path/lib/libgcc_s.so succeeded
...

据我所知, .so 代表“共享对象”。我想 .a 用于存档(编译对象的集合)。