编译C程序为FDPIC ELF格式运行出现segmentation fault如何解决?
问题诱因
- 参数混用冲突:
-shared是用于编译动态共享库的链接参数,-fPIE是用于编译位置独立可执行文件的编译参数,二者同时使用会生成格式异常的ELF文件,既不是合法的可执行程序也不是合法的共享库,加载器无法正确识别程序入口地址,访问非法内存触发段错误。 - 缺少FDPIC专属编译标识:普通
-fPIC/-fPIE仅能生成通用位置无关代码,ARM架构下的FDPIC格式需要显式指定专属编译参数,原有命令未添加对应参数,根本无法生成符合要求的FDPIC格式文件。 - 工具链兼容性问题:并非所有arm-linux-gnueabi-gcc版本都默认支持FDPIC格式,未开启FDPIC支持的工具链即使添加正确参数也无法生成合法的目标文件。
解决方法
- 修正编译命令:移除冲突的
-shared参数,添加FDPIC专属编译标识,正确命令为:
其中arm-linux-gnueabi-gcc -mfdpic -fPIE -pie helloworld.c -o out-mfdpic为ARM架构生成FDPIC格式代码的核心参数,-pie指定链接为位置独立可执行文件。 - 验证工具链支持:执行
arm-linux-gnueabi-gcc --target-help | grep fdpic,确认输出包含-mfdpic相关选项,若没有则需要更换支持FDPIC的ARM交叉编译工具链,如基于musl或uclibc-ng构建的FDPIC专用工具链。 - 验证生成文件合法性:编译完成后执行
readelf -h out,检查ELF头部的Flags字段是否包含FDPIC标识,确认格式正确后再用qemu-arm运行即可正常执行。
内容的提问来源于stack exchange,提问作者Mahyar Shokraeian
相关产品推荐
相关产品推荐

