linux - 如何从 bash 脚本确定 gcc 的配置?

标签 linux bash ubuntu gcc

我有一个 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 已通过 CCCFLAGS 变量指定,即使在那里不是很明显,它也会识别 PIE。例如,出于技术原因,Fedora hides the PIE flags behind a -specs argument .

关于linux - 如何从 bash 脚本确定 gcc 的配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52577438/

相关文章:

bash - 使用 AWS CLI 选择实例内的 Autoscaling 组标签

linux - Bash 从 stdout 获取最后一行(组合)

r - 配置错误在 Ubuntu : checking whether bzip2 support suffices. 上安装 R-3.3.2 .. 配置:错误:需要 bzip2 库和 header

linux - 尝试通过 crontab 运行脚本,但这是行不通的

c++ - Raspberry Pi 2 上的 g++-4.9:链接时对 `boost::atomics::detail::lockpool::get_lock_for 的 undefined reference

linux - 一步删除文件和符号链接(symbolic link)

python - 在 Python 2.6 中导入 Pylab 时出现问题

linux - UNIX 中的文件操作 - 根据列计数创建重复记录并仅操作一列

linux - Bash 陷阱不会杀死 child ,导致意外的 ctrl-c 行为

svn - 谷歌代码 SVN checkin 错误