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



我有一个bash脚本,它可以在旧版本的Ubuntu(14.04.x和16.04.x(上编译一个程序,而不是在最后一个版本(18.04.x(和其他发行版(Arch,CentOS,Debian,Fedora等(上编译程序,因此...具有不同的 GCC 设置。

然后,要获得可以通过双击启动(以及其他方式(的可执行文件,当我必须使用此选项"=no-pie"作为新版本的 gcc 设置(在 Ubuntu 18.04.x 上(时,我必须使用旧版本的 gcc 设置(Ubuntu 14.04.x 和 16.04.x(编译这个程序而不使用"-no-pie"选项。

问题是,在最后一个 Ubuntu 版本(18.04.x(及其衍生产品(Kubuntu、Xbuntu 等,也许还有其他发行版(上,gcc (7.3( 的新配置具有"--enable-default-pie"选项,如果我编译我的程序而不使用选项"-no-pie",结果是创建的文件是"共享库"类型的可执行文件,无法通过双击启动。

我的问题是:

a( 是否有命令允许我从 bash 脚本中确定 gcc 是否配置了"--启用默认-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 将 PIE 标志隐藏在 -specs 参数后面。

是的,您可以使用gcc -vgcc -###检查GCC构建选项

为了有漂亮的印刷品,你可以使用:

gcc -### -E 2>&1 | grep "Configured with" | sed 's/--/n--/g'

所以抨击一句话说你有没有馅饼可能是:

if [[ -n "`gcc -v -E 2>&1 | grep 'Configured with' | sed 's/--/n--/g' | grep enable-default-spie`" ]]; then echo "PIE DEFAULT"; else echo "PIE NOT DEFAULT"; fi

要检查文件类型,只需使用file命令,例如:

file /usr/bin/x86_64-linux-gnu-gcc-7
/

usr/bin/x86_64-linux-gnu-gcc-7: ELF 64-bit LSB可执行文件, x86-64,版本 1 (SYSV(,动态链接,解释器/lib64/ld-linux-x86-64.so.2, 适用于 GNU/Linux 3.2.0, 构建 ID[sha1]=02ac46ba938c15f55f6fab165133e0f527bc2197,剥离

file /usr/lib/libchm.so.1.0.0
/

usr/lib/libchm.so.1.0.0: ELF 64-bit LSB共享对象, x86-64, 版本 1 (SYSV(,动态链接, BuildID[sha1]=7c603d9a0771b5bfd5b869b4446e2f78ef13802a,剥离

文件类型函数

function whatfile { file $1 -i | grep application | sed 's/^.*application/x-//g;s/,.*$//g'; }

示例输出:

aaa@xxx:~ $ whatfile /boot/grub/grub.conf
aaa@xxx:~ $ whatfile /usr/lib/libnss3.so
sharedlib
aaa@xxx:~ $ whatfile /bin/zcat
executable

不幸的是,注释不允许CR + LF(显示预先格式化的文本(。

以下是我对 gcc 设置命令的格式化翻译:

check_gcc_setting()
{
if [ -n "`gcc -v -E 2>&1 | grep 'Configured with' | sed 's/--/n--/g' | grep enable-default-pie`" ]
then
GCC_SETTING="1"
else
GCC_SETTING="0"
fi
read -p "The gcc setting is $GCC_SETTING " GCCRESULT
}

结果如下:

whatfile { file $1 -i | grep application | sed 's/^.*application/x-//g;s/,.*$//g'; }
-bash: syntax error near unexpected token `}'

最新更新