解决undefined reference to `__fdelt_chk@GLIBC_2.15'的问题

本文指导如何解决Ubuntu 10.10环境下编译时因glibc版本过低引起的undefined reference to '_fdelt_chk@GLIBC_2.15'错误。通过下载并更新glibc版本至2.20,以及在编译过程中正确设置环境变量和makefile,最终成功解决了该问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境配置:ubuntu 10.10

编译时遇到一个问题
undefined reference to `__fdelt_chk@GLIBC_2.15’

用strings /lib/libc.so.6 |grep GLIBC_ 查看系统glibc的版本太低了,需要更新版本
http://www.gnu.org/software/libc/download.html下载glibc-2.20.tar.gz

  • 解压glibc-2.20.tar.gz
  • cd glibc-2.20
  • mkdir build
  • cd build
  • ../configure –prefix=/opt/glibc-2.20

configure的时候,可能会出现下面的错误,提示

*** Check the INSTALL file for required versions.
checking LD_LIBRARY_PATH variable... contains current directory
configure: error: 
*** LD_LIBRARY_PATH shouldn't contain the current directory when
*** building glibc. Please change the environment variable
*** and run configure again

这是你的LD_LIBRARY_PATH里的值有冲突,记得备份原来的值,然后

  • export LD_LIBRARY_PATH=/usr/local/lib

编译完之后记得把LD_LIBRARY_PATH改回去,这里修改只是为了configure通过生成makefile

  • make
  • make install

安装GLIBC成功后,
再回到你需要编译的文件夹中,修改makefile文件,把更高版本的GLIBC链接进去,如

-L/opt/glibc-2.20/lib

参考资料
解决libc.so.6: version `GLIBC_2.14’ not found问题

### 解决方案分析 `undefined reference to __memcpy_chk` 错误通常是由编译器启用了 `-fstack-protector` 或者类似的选项引起的。这些选项会启用堆栈保护机制,而该机制依赖一些特定的库函数(如 `__stack_chk_guard`, `__memcpy_chk` 等)。如果目标环境中缺少这些支持,则会出现未定义引用错误。 以下是可能的原因以及解决方案: #### 可能原因 1. **缺失标准 C 库的支持** 如果使用了 `-nostdlib` 编译选项,可能会导致链接阶段找不到必要的标准库函数[^1]。 2. **编译器配置问题** 启用了堆栈保护功能(如 `-fstack-protector`),但目标环境并未提供相应的支持[^2]。 3. **工具链不匹配** 工具链版本较旧,或者未正确配置以支持现代的安全特性[^4]。 --- ### 解决方法 #### 方法一:禁用堆栈保护功能 可以通过修改编译选项来关闭堆栈保护功能。具体操作如下: ```bash CFLAGS="-fno-stack-protector" CXXFLAGS="-fno-stack-protector" ``` 这可以防止编译器尝试调用诸如 `__stack_chk_guard``__memcpy_chk` 的函数。 #### 方法二:重新构建工具链并启用 SSP 支持 如果希望保留堆栈保护功能,则需要确保工具链已正确配置以支持 Stack Smashing Protection (SSP) 功能。可以在工具链配置菜单中启用此选项: ```plaintext make menuconfig ---> Toolchain Options ---> Enable Stack-Smashing Protection support ``` 完成配置后,重新构建工具链即可。 #### 方法三:手动链接所需的库文件 如果不想完全禁用堆栈保护功能,也可以通过显式链接 glibc解决问题。例如,在编译命令中添加以下参数: ```bash -lc -lgcc -lm ``` 这样可以确保链接到的标准库包含所需的功能实现。 #### 方法四:替换或更新工具链 对于某些老旧工具链来说,可能存在兼容性问题。考虑升级至最新版的 GCC 工具链,以便获得更好的安全特性和更全面的支持[^3]。 --- ### 示例代码调整 假设当前使用的 Makefile 配置如下: ```Makefile CC = arm-linux-gcc CFLAGS = -Wall -O2 -nostdlib LDFLAGS = TARGET = example.bin SRCS = main.c utils.c all: $(TARGET) $(TARGET): $(OBJS) $(CC) $(LDFLAGS) -o $@ $^ clean: rm -rf *.o $(TARGET) ``` 为了修复上述问题,可将 `CFLAGS` 修改为: ```Makefile CFLAGS = -Wall -O2 -fno-stack-protector ``` 同时确保链接阶段包含了必要库文件: ```Makefile LDFLAGS = -lc -lgcc -lm ``` --- ### 总结 以上提供了四种不同的解决策略,分别适用于不同场景下的需求。推荐优先尝试禁用堆栈保护功能的方法,因为这是最简单且有效的手段;但如果项目确实需要开启此类保护措施,则需确保工具链具备相应的能力和支持。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值