【问题标题】:How to determine the configuration of gcc from a bash script?如何从 bash 脚本确定 gcc 的配置?
【发布时间】:2019-03-05 18:09:02
【问题描述】:

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

然后,要获得可以通过双击启动(以及其他方式)的可执行文件,我必须使用旧版本的 gcc 设置(Ubuntu 14.04.x 和 16.04 .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 的任何设置。

提前感谢您的时间、想法和建议。

最好的问候。

【问题讨论】:

  • 什么你没有检测到 gcc 的版本并相应地调整标志?
  • 嗨 OznOg,Anti 刚刚在我正在寻找的回复下方发给我。感谢您的宝贵时间和最诚挚的问候。

标签: linux bash ubuntu gcc


【解决方案1】:

是的,您可以使用 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

【讨论】:

  • 嗨 Anty,非常感谢您提供给我的命令行示例,用于检查 gcc 是否使用 --enable-default-pie 选项pr not。这完全解决了我的期望。你是冠军。但是,如果可以的话,我会很感激同样的命令行示例之王从命令行“file myprog”的响应中提取世界“可执行文件”,因为我对 grep 和 sed 命令真的很陌生。无论如何,再次非常感谢您的大力帮助。
  • 请注意,这在 Fedora 上不起作用,它通过构建标志启用 PIE,即使 GCC 本身并不默认使用 PIE。
  • 你好,弗洛里安。是的,我已经注意到 Anti 对此发行版的回应。那么,为了获得与 Fedora 相似的结果(我猜 CentOS 和 RedHat 都可以),可能需要发送什么命令行。如前所述,我是 grep 和 sed 命令的新手,我非常感谢学习示例。然后,我尝试使建议的命令行适应我的 bash 脚本,Anti 的响应解决了我的问题的“很大一部分”(Debian、Ubuntu 和 Co),当然这超出了 Fedora 的范围。你能帮帮我吗?最好的问候。
  • PCKB - 在我的原始答案中查找文件类型检测功能。
  • 嗨 Anti,我尝试了你的建议,但我得到:“whatfile { file $1 -i | grep application | sed 's/^.*application\/x-//g;s/,. *$//g'; } -bash: 意外标记附近的语法错误}'. Since I'm a real newbee with the grep and sed commands, I'm unable to correct your command and translate it into my bash script. BTW, I translated the excellent command for gcc as follow; check_gcc() { 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 } TIA
【解决方案2】:

检查 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

【讨论】:

  • 嗨,弗洛里安,谢谢,但我问的是如何在 bash 脚本中执行此操作,Anti 在上面给出了很好的回应。感谢您的时间与兴趣。最好的问候。
【解决方案3】:

很遗憾,cmets 不允许 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 `}'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 2013-01-14
    • 2018-01-15
    • 1970-01-01
    相关资源
    最近更新 更多