缺失的libgcc_s.a该如何处理?

10

使用外部工具链别名codesourcery lite 2011在Buildroot中交叉编译库,导致...

output/host/opt/ext-toolchain/bin/../lib/gcc/arm-none-linux-gnueabi/4.6.1/../../../../arm-none-linux-gnueabi/bin/ld: cannot find -lgcc_s
collect2: ld returned 1 exit status

由于明显缺少 libgcc_s.a

# find . -iname "libgcc*"        
./output/host/usr/arm-buildroot-linux-gnueabi/sysroot/lib/libgcc_s.so
./output/host/usr/arm-buildroot-linux-gnueabi/sysroot/lib/libgcc_s.so.1
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/armv4t/lib/libgcc_s.so.1
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/armv4t/lib/libgcc_s.so
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/thumb2/lib/libgcc_s.so.1
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/thumb2/lib/libgcc_s.so
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/lib/libgcc_s.so.1
./output/host/opt/ext-toolchain/arm-none-linux-gnueabi/libc/lib/libgcc_s.so
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/armv4t/libgcc.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/armv4t/libgcc_eh.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/plugin/libgcc
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/thumb2/libgcc.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/thumb2/libgcc_eh.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/libgcc.a
./output/host/opt/ext-toolchain/lib/gcc/arm-none-linux-gnueabi/4.6.1/libgcc_eh.a

有没有办法绕过这个问题,但仍然使用静态链接?有 CLFAGS 或 LDFLAGS 选项可以除了 libgcc_s 之外,将所有东西都静态链接吗?

到目前为止尝试的方法(超出阅读适用部分的 ldgcc 手册):

CFLAGS="-static -static-libgcc"
CFLAGS="-static -shared-libgcc"
CFLAGS="-static -static-libgcc -Wl,-Bstatic"
CFLAGS="-static -shared-libgcc -Wl,-Bstatic"
在添加了-Wl,-lgcc_s,-Bstatic之后,我得到了大量未定义/未知符号...(-Bshared不是有效的选项,ld说)。
/home/bernhard/buildroot-2013.08/output/target/usr/lib/libgio-2.0.a(libgio_2_0_la-glocalfileinfo.o): In function `_g_local_file_info_get':
glocalfileinfo.c:(.text+0x2d90): warning: Using 'getgrgid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/home/bernhard/buildroot-2013.08/output/target/usr/lib/libgio-2.0.a(libgio_2_0_la-glocalvfs.o): In function `g_local_vfs_parse_name':
glocalvfs.c:(.text+0x174): warning: Using 'getpwnam' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/home/bernhard/buildroot-2013.08/output/target/usr/lib/libglib-2.0.a(libglib_2_0_la-gutils.o): In function `g_get_user_database_entry':
gutils.c:(.text+0x254): warning: Using 'getpwuid' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
gutils.c:(.text+0x24c): warning: Using 'setpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
gutils.c:(.text+0x25c): warning: Using 'endpwent' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
gutils.c:(.text+0xa0): warning: Using 'getpwnam_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
gutils.c:(.text+0xe0): warning: Using 'getpwuid_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
/home/bernhard/buildroot-2013.08/output/target/usr/lib/libgio-2.0.a(libgio_2_0_la-gnetworkaddress.o): In function `g_network_address_parse_sockaddr':
gnetworkaddress.c:(.text+0x1ac): warning: Using 'getaddrinfo' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking
<<<< SNIP >>>>
/home/bernhard/buildroot-2013.08/output/target/usr/lib/libxml2.a(xmlschemastypes.o): In function `xmlSchemaGetCanonValue':
xmlschemastypes.c:(.text+0x7680): undefined reference to `trunc'
xmlschemastypes.c:(.text+0x76bc): undefined reference to `trunc'
xmlschemastypes.c:(.text+0x7710): undefined reference to `floor'
xmlschemastypes.c:(.text+0x7760): undefined reference to `floor'
collect2: ld returned 1 exit status

https://dev59.com/IFzUa4cB1Zd3GeqP2Vl5 - Ciro Santilli OurBigBook.com
1个回答

13

使用标志防止gcc使用内部内置函数(如其内置的memcpy)可能可以消除对libgcc_s.a的使用,但最好还是找到并使用它。

看起来这个选项应该可以防止使用内置函数 -fno-builtin。更多细节请参见:http://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

链接共享库libgcc_s.so

如果缺少libgcc_s.a,或者希望在其他情况下使用共享的libgcc_s与静态可执行文件,可以使用以下方法:

CFLAGS="-static -Wl,-Bdynamic,-lgcc_s,-Bstatic"

次优 - 我被那个工具链所困住了...而且 -fno-builtin 似乎失败/不足,但我目前的构建脚本还有其他问题需要解决 - 一旦它能够正常工作/我确定不起作用,我会回复评论的。 - drahnr
我了解。也许你可以回到工具链的源头,尝试从那里获取libgcc_s.a。可能可以从其他地方获取并使用它,但这可能会导致痛苦的错误。停止使用libgcc_s.a是有可能的,但已经很久没有使用它了。 - ash
我仍然是一个交叉编译的新手,所以我不想冒那么大的风险(也请参见更新的问题)。 - drahnr
1
啊,看起来应该是“-Bdynamic”,而不是shared。 - ash
2
第一次通过命令行引入库决定了它的包含方式。如果设置为静态,则必须是静态的;如果设置为动态,则可以是动态或静态的。因此,"-Bstatic -lx -Bdynamic -ly" 将 x 作为静态,y 作为任意类型。通常,为了强制一个库为静态,我们使用 "-Bstatic -lx -Bdynamic",这样就可以在其他参数之前和之后添加它而不会出现问题。 - ash
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接