c - 将 libc 静态链接到我的二进制文件会导致它出现段错误
问题描述
我需要使用静态链接的 libc 构建二进制文件。我在与源代码相同的目录中提供了 libc.a。为了编译,我尝试了以下方法:
gcc -o foo foo.c libc.a
这导致了以下问题:
/usr/bin/ld: dynamic STT_GNU_IFUNC symbol `strcmp' with pointer equality in `libc.a(strcmp.o)' can not be used when making an executable
在研究这个时,我发现了以下问题:Linking partial static and partial dynamic in GCC
按照上面答案中的解决方案,我在中创建了自己的字符串比较函数my_strcmp.c
并尝试了以下编译:
gcc -o foo foo.c mystrcmp.c libc.a
它可以工作,但是二进制文件现在很早就出现了段错误。如果没有静态链接的 libc,这不会发生。这是 GDB 跟踪:
(gdb) backtrace
#0 0x00000000004fe48e in generic_start_main ()
#1 0x00000000004fe891 in __libc_start_main ()
#2 0x0000000000406b56 in _start ()
不太清楚如何解释这一点。有人有想法么?
解决方案
如果要生成静态链接的二进制文件,只需添加-static
到命令行。你根本不需要libc.a
那里。你在做什么,libc.a
不添加-static
,会产生一个动态链接的二进制文件,但会从 中提取一些函数/文件(无论你引用什么,以及那些引用的所有内容,递归)libc.a
,并且仍然有共享libc.so
参与你的程序。这些通常不能一起工作。
推荐阅读
- r - 如何将标签而不是数值放在传单的调色板中
- mysql - 编写单条查询SQL,根据以下条件计算用户数
- react-native - 使用 React Native 在 Azure Ad 中的组下登录用户
- amazon-s3 - AWS S3 反向代理 - 我们计算的请求签名与您提供的签名不匹配。检查您的密钥和签名方法
- reactjs - React-tsx InputSelect 基于 Enum
- batch-file - cli 参数和提示
- javascript - 通过状态映射:(TypeError):this.state.[something].map 不是函数
- stripe-payments - Telegram Bot Payment 不适用于 Apple Pay
- java - Unmarshaller 在简单的 XML 字符串解析中抛出 IllegalAccessError
- mysql - 更新后,无法启动 MySQL Community Server