即使在Ubuntu 12.10上libgcc_s.so链接未损坏,ld也找不到lgcc_s

Sam*_*mik 2 gcc static-linking ubuntu-12.10

我现在面临一个问题,编译与gcc-static-static-libgcc编译器启用的标志和-Wl,-static用于连接上启用的Ubuntu 12.10标志。但是应用程序通过动态链接(无需使用这些标志)可以很好地构建。

/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
Run Code Online (Sandbox Code Playgroud)

的输出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
Run Code Online (Sandbox Code Playgroud)

有人可以通过静态链接帮助我解决此问题吗?也请告知我是否需要其他详细信息。谢谢。

Mar*_* MD 5

您的链接器可能找不到libgcc_s.a的静态版本libgcc_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
...
Run Code Online (Sandbox Code Playgroud)

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