【问题标题】:How to know the gcc version used to build the linux?如何知道用于构建 linux 的 gcc 版本?
【发布时间】:2015-06-17 17:58:23
【问题描述】:

我使用 OpenWRT。它是嵌入式系统的 linux 发行版

我想知道编译linux使用的gcc版本

我在网上做了一些研究,但没有结果。

我尝试对 linux OpenWRT 中的一些现有二进制文件执行这些命令(如 wget)

strings -a <default binary> | grep "GCC"
strings -a <default binary> | grep "gcc"

但我没有得到任何结果

即使是

strings -a  /lib/libgcc_s.so.1 | grep  "gcc"
strings -a /lib/libuClibc-0.9.30.1.so | grep   "gcc"

不给出任何结果

有没有办法知道使用 gcc 构建整个 linux(对于用户空间和内核空间)?

【问题讨论】:

  • 内核或用户空间程序?
  • 无法确定使用哪个 gcc 来构建“整个 linux”。每个可执行文件可能是使用不同的 gcc 构建的,甚至可执行文件中的库也是使用一个 gcc 构建的,或者它甚至可能根本不是 C 程序(C++、Fortran、Java(使用 gcj)等)。

标签: c++ c linux gcc openwrt


【解决方案1】:

对于程序,如果您的系统正在使用 ELF,它会出现在 ELF 可执行文件的 .comment 部分中。

$猫main.c int main() { } $ gcc main.c $ objdump -s -j .comment a.out a.out:文件格式elf64-x86-64 .comment 部分的内容: 0000 00474343 3a202844 65626961 6e20342e .GCC: (Debian 4. 0010 372e322d 35292034 2e372e32 00474343 7.2-5) 4.7.2.GCC 0020 3a202844 65626961 6e20342e 342e372d : (Debian 4.4.7- 0030 33292034 2e342e37 00 3) 4.4.7。

用于编译内核的编译器可从/proc/version中的字符串获得,例如:

$ 猫 /proc/版本 Linux 版本 3.8.5 (...) (gcc 版本 4.7.2 (Debian 4.7.2-5) ) ...

一个主要警告

.comment 部分是可选的。当可执行文件捆绑到一个包中时,许多发行版会将其从可执行文件中剥离。该部分将放置在单独的调试包中。

例如,在我的系统上:

$ objdump -s -j .comment /usr/lib/x86_64-linux-gnu/libcurl.so.4.2.0 /usr/lib/x86_64-linux-gnu/libcurl.so.4.2.0:文件格式elf64-x86-64 objdump:-j 选项中提到的“.comment”部分,但在任何输入中都找不到 文件

安装 libcurl3-dbg 包后,我们通过 GNU 调试链接获得带有剥离部分的图像:

$ objdump -s -j .comment \ /usr/lib/debug/.build-id/8c/4ae0ad17a4e76bab47c487047490061bd49de3.debug /usr/lib/debug/.build-id/8c/4ae0ad17a4e76bab47c487047490061bd49de3.debug: 文件格式 elf64-x86-64 .comment 部分的内容: 0000 4743433a 20284465 6269616e 20342e37 GCC:(Debian 4.7 0010 2e322d35 2920342e 372e3200 .2-5) 4.7.2。

【讨论】:

  • cat /proc/version 以任何方式帮助我 (+1) 找出用于构建内核的 gcc,我认为它与构建 OpenWRT 用户空间的方式相同
  • @MOHAMED:我没有注意到-a。无论如何,您的二进制文件可能已被剥离,您必须从调试文件中获取版本。
  • 在哪里可以找到调试文件?
  • @MOHAMED:这取决于发行版。它们不一定存在,并且可能并非对所有软件包都存在。
【解决方案2】:

为了构建 OpenWRT 工作区,您需要使用主 gcc:

gcc --version

对于交叉编译,所有需要的工具都位于您的 openwrt 构建目录下。

编译时使用的gcc可以在OpenWRT的staging directory找到。转到您的 openwrt 主目录并在暂存目录下查找 toolchain 目录。在这里你会找到一个bin 目录,所有的交叉编译工具都在这里。 例如ar71xx:

$ ./staging_dir/toolchain-mips_r2_gcc-4.6-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-gcc --version
mips-openwrt-linux-gcc (OpenWrt/Linaro GCC 4.6-2013.05 r57678) 4.6.4

【讨论】:

    猜你喜欢
    • 2018-10-25
    • 2012-06-25
    • 2018-08-31
    • 2023-03-25
    • 1970-01-01
    • 2011-04-11
    • 2011-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多