我有一个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”选项就编译程序,则结果是创建的文件是“共享库”类型的可执行文件,无法通过双击启动。 / p>
我的问题是:
a)是否有一条命令可以让我从bash脚本中确定gcc是否配置了“ --enable-default-pie”设置?
b)如果没有,是否有命令可以让我从bash脚本中确定编译后的文件是“共享库”还是“可执行”类型?
对于第二个选项,一个解决方案可能是如何将“ gcc -v”的响应保存在.txt文件中,并检查是否存在“ --enable-default-pie”字符串,但是我绝对没有提示如何做。
如果我对第一个选项没有答案,那么第二个选项(确实不那么优雅,但效果同样好)将允许我先编译程序而无需使用“ -no-pie”选项,然后检查这样创建的可执行文件的状态,如果结果是“共享库”,则这次使用选项“ -no-pie”重新启动该编译,以在一种情况下(如在另一种情况下)获取可以通过以下方式启动的可执行文件:双击gcc的设置。
预先感谢您的时间,想法和建议。
最好的问候。
答案 0 :(得分:0)
是的,您可以使用gcc -v
或gcc -###
要获得漂亮的打印效果,可以使用:
gcc -### -E 2>&1 | grep "Configured with" | sed 's/--/\n--/g'
所以bash oneliner说您是否有馅饼可能是:
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位LSB 可执行, x86-64,版本1(SYSV),动态链接,解释器 /lib64/ld-linux-x86-64.so.2,用于GNU / Linux 3.2.0, BuildID [sha1] = 02ac46ba938c15f55f6fab165133e0f527bc2197,已剥离
file /usr/lib/libchm.so.1.0.0
/usr/lib/libchm.so.1.0.0:ELF 64位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
答案 1 :(得分:0)
检查PIE支持的推荐方法是像这样编译C代码
#if defined __PIC__ || defined __pic__ || defined PIC || defined pic
# error PIC is default.
#endif
带有请求的编译器标志,并检查是否存在错误。如果您需要对PIE进行特殊处理,即使已通过CC
或CFLAGS
变量指定了PIE,即使在该位置上不是立即可见的,也会识别PIE。例如,出于技术原因,Fedora hides the PIE flags behind a -specs argument。
答案 2 :(得分:0)
不幸的是,注释不允许 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 `}'