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

时间:2018-09-30 11:27:09

标签: 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”选项就编译程序,则结果是创建的文件是“共享库”类型的可执行文件,无法通过双击启动。 / p>

我的问题是:

a)是否有一条命令可以让我从bash脚本中确定gcc是否配置了“ --enable-default-pie”设置?

b)如果没有,是否有命令可以让我从bash脚本中确定编译后的文件是“共享库”还是“可执行”类型?

对于第二个选项,一个解决方案可能是如何将“ gcc -v”的响应保存在.txt文件中,并检查是否存在“ --enable-default-pie”字符串,但是我绝对没有提示如何做。

如果我对第一个选项没有答案,那么第二个选项(确实不那么优雅,但效果同样好)将允许我先编译程序而无需使用“ -no-pie”选项,然后检查这样创建的可执行文件的状态,如果结果是“共享库”,则这次使用选项“ -no-pie”重新启动该编译,以在一种情况下(如在另一种情况下)获取可以通过以下方式启动的可执行文件:双击gcc的设置。

预先感谢您的时间,想法和建议。

最好的问候。

3 个答案:

答案 0 :(得分:0)

是的,您可以使用gcc -vgcc -###

检查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进行特殊处理,即使已通过CCCFLAGS变量指定了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 `}'