我有一个 bash 脚本,它在旧版本的 Ubuntu(14.04.x 和 16.04.x)上比在上一个版本(18.04.x)和其他发行版(Arch、CentOS、Debian、Fedora)上编译程序等),因此...具有不同的 gcc 设置。
然后,为了获得可以通过双击启动(以及其他方式)的可执行文件,我必须使用旧版本的 gcc 设置(Ubuntu 14.04.x 和 16.04)在没有“-no-pie”选项的情况下编译这个程序.x) 当我必须为新版本的 gcc 7.3 设置(在 Ubuntu 18.04.x 上)使用此选项“=no-pie”时。
问题在于,在最新的 Ubuntu 版本 (18.04.x) 及其衍生版本(Kubuntu、Xbuntu 等,可能还有其他发行版)中,gcc (7.3) 的新配置具有选项“--enable- default-pie”,如果我在没有选项“-no-pie”的情况下编译我的程序,结果是创建的文件是一个“共享库”类型的可执行文件,不能通过双击启动。
我的问题是:
a) 是否有命令允许我从 bash 脚本确定 gcc 是否配置了“--enable-default-pie”设置?
b) 如果不是,是否有命令允许我从 bash 脚本确定编译文件是“共享库”还是“可执行”类型?
对于第二个选项,解决方案可能是如何将“gcc -v”的响应保存在 .txt 文件中并检查是否有“--enable-default-pie”字符串,但我绝对没有知道怎么做。
如果我的第一个选项没有答案,第二个选项(确实不那么优雅但同样有效)将允许我在没有“-no-pie”选项的情况下先编译我的程序,然后检查这样创建的可执行文件的状态,如果结果是“共享库”,这次使用选项“-no-pie”重新启动此编译,在一种情况下和另一种情况下一样,获得可以启动的可执行文件双击 gcc 的任何设置。
预先感谢您抽出时间、提出想法和建议。
最好的问候。
最佳答案
检查 PIE 支持的推荐方法是像这样编译 C 代码
#if defined __PIC__ || defined __pic__ || defined PIC || defined pic
# error PIC is default.
#endif
使用请求的编译器标志并检查是否有错误。如果您需要对 PIE 进行特殊处理,如果 PIE 已通过 CC
或 CFLAGS
变量指定,即使在那里不是很明显,它也会识别 PIE。例如,出于技术原因,Fedora hides the PIE flags behind a -specs argument .
关于linux - 如何从 bash 脚本确定 gcc 的配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52577438/