Ubuntu20.04使用scc(scheme2c)编译Scheme报PIE链接错误如何解决
问题原因
Ubuntu 20.04 版本的 GCC 工具链默认开启 PIE(位置无关可执行文件) 链接校验,要求所有参与链接的目标文件、静态库都必须使用-fPIE参数编译。官方软件源提供的 scheme2c 2012.10.14 版本附带的libs2c.a静态库是早年按非PIE规则编译的产物,不符合当前链接器的校验要求,因此抛出重定位错误。
解决方法
快速修复(推荐,无需修改系统文件)
scc支持通过-ldopt参数将选项透传给底层的链接器,编译时传入-no-pie告知链接器生成非PIE格式的可执行文件,即可绕过校验完成编译:
# 直接编译,默认生成a.out可执行文件 scc -ldopt -no-pie hello.sc # 需要指定输出文件名时追加-o参数即可 scc -ldopt -no-pie hello.sc -o hello
编译完成后运行生成的二进制文件,就能正常得到输出:
Hello!
该方法生成的程序在桌面、服务器场景下运行没有任何兼容性问题,是最省事的方案。
重编译PIE版静态库(仅特殊合规需求使用)
如果使用场景强制要求生成PIE格式的可执行文件,可以下载scheme2c源码,在编译配置中添加-fPIE选项,重新构建出libs2c.a静态库后,替换/usr/lib/scheme2c/路径下的原有库文件即可。普通使用场景完全不需要走这个流程。
内容的提问来源于stack exchange,提问作者Flux。
相关产品推荐
相关产品推荐

