AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 565593
Accepted
Ashfaqur Rahaman
Ashfaqur Rahaman
Asked: 2020-02-04 09:57:29 +0800 CST2020-02-04 09:57:29 +0800 CST 2020-02-04 09:57:29 +0800 CST

针对定制的 GLIBC 编译 GCC

  • 772

我试图针对定制的 GLIBC 2.30 编译 GCC 9.2。我在非标准位置安装了 GLIBC。然后我按照以下步骤编译 GCC:

sfinix@multivac:~$ GLIBCDIR=/home/sfinix/programming/repos/glibc/glibc-install/
sfinix@multivac:~$ export LDFLAGS="-Wl,-q"
sfinix@multivac:~$ CFLAGS="-L "${GLIBCDIR}/lib" -I "${GLIBCDIR}/include" -Wl,--rpath="${GLIBCDIR}/lib" -Wl,--dynamic-linker="${GLIBCDIR}/lib/ld-linux-x86-64.so.2""
sfinix@multivac:~$ cd ${GCC_BUILD_DIR}
sfinix@multivac:~$ make -j 4 CFLAGS="${CFLAGS}" CXXFLAGS="${CFLAGS}"

编译成功,但问题是 GCC 仍在拾取旧库:

sfinix@multivac:~$ ldd programming/repos/gcc/gcc-install/bin/gcc-9.2
        linux-vdso.so.1 (0x00007ffc3b7cb000)
        libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f177772f000)
        libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f177733e000)
        /lib64/ld-linux-x86-64.so.2 (0x00007f1777acd000)

输出readelf -d programming/repos/gcc/gcc-install/bin/gcc-9.2:

Dynamic section at offset 0x113dd8 contains 27 entries:
  Tag        Type                         Name/Value
 0x0000000000000001 (NEEDED)             Shared library: [libm.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
 0x0000000000000001 (NEEDED)             Shared library: [ld-linux-x86-64.so.2]
 0x000000000000000c (INIT)               0x402a80
 0x000000000000000d (FINI)               0x488440
 0x0000000000000019 (INIT_ARRAY)         0x712de8
 0x000000000000001b (INIT_ARRAYSZ)       48 (bytes)
 0x000000000000001a (FINI_ARRAY)         0x712e18
 0x000000000000001c (FINI_ARRAYSZ)       8 (bytes)
 0x0000000000000004 (HASH)               0x4002b0
 0x000000006ffffef5 (GNU_HASH)           0x400728
 0x0000000000000005 (STRTAB)             0x4015f0
 0x0000000000000006 (SYMTAB)             0x400798
 0x000000000000000a (STRSZ)              1373 (bytes)
 0x000000000000000b (SYMENT)             24 (bytes)
 0x0000000000000015 (DEBUG)              0x0
 0x0000000000000003 (PLTGOT)             0x714000
 0x0000000000000002 (PLTRELSZ)           3264 (bytes)
 0x0000000000000014 (PLTREL)             RELA
 0x0000000000000017 (JMPREL)             0x401dc0
 0x0000000000000007 (RELA)               0x401d00
 0x0000000000000008 (RELASZ)             192 (bytes)
 0x0000000000000009 (RELAENT)            24 (bytes)
 0x000000006ffffffe (VERNEED)            0x401c80
 0x000000006fffffff (VERNEEDNUM)         2
 0x000000006ffffff0 (VERSYM)             0x401b4e
 0x0000000000000000 (NULL)               0x0

虽然这种方法适用于其他程序,但我正在编译自己进行测试:

sfinix@multivac:~$ GLIBDIR=/home/sfinix/programming/repos/glibc/glibc-install/
sfinix@multivac:~$ vim test.c
sfinix@multivac:~$ CFLAGS="-L ${GLIBDIR}/lib -I ${GLIBDIR}/include -Wl,--rpath=${GLIBDIR}/lib -Wl,--dynamic-linker=${GLIBDIR}/lib/ld-linux-x86-64.so.2"
sfinix@multivac:~$ gcc -Wall -g ${CFLAGS} test.c -o run
sfinix@multivac:~$ ldd run
        linux-vdso.so.1 (0x00007ffd616d5000)
        libc.so.6 => /home/sfinix/programming/repos/glibc/glibc-install//lib/libc.so.6 (0x00007f5fcdc6e000)
        /home/sfinix/programming/repos/glibc/glibc-install//lib/ld-linux-x86-64.so.2 => /lib64/ld-linux-x86-64.so.2 (0x00007f5fce22a000)

我错过了什么?如何针对自定义 GLIBC 编译 GCC?如何传递编译器和链接器标志?

compiling gcc
  • 2 2 个回答
  • 4391 Views

2 个回答

  • Voted
  1. icarus
    2020-02-04T22:26:38+08:002020-02-04T22:26:38+08:00

    按要求回答问题。

    在没有看到的Makefile情况下,无法说出最终链接步骤中使用了哪些变量(如果有)。CFLAGS并且LDFLAGS是广泛支持的约定,但不是必需的。OP 在评论中告诉我们这Makefile是“巨大的”并且可能是自动生成的。现在 GNU Make 有-O --trace一些选项,因此可以从中找到用于执行最终链接的命令,然后手动运行该步骤并进行所需的修改,或者使用这些信息来查看在 makefile 中的哪个位置调用了该命令,并且从那里开始工作以找到需要编辑或设置的内容以获得所需的链接步骤。

    另一种方法

    的输出readelf -d向我们显示可执行文件缺少一个RPATH或RUNPATH指向所需库。由于需要链接的库是 glibc 的自定义版本,因此很可能(但不确定)它们将具有与实际用于链接的 glibc 相同的 API。有了这个假设,就可以编辑二进制文件以添加缺失的RUNPATH. 一个合适的程序是patchelf,它为各种 linux 发行版打包。

    OP报告成功

    patchelf --set-rpath ${GLIBCDIR}/lib --set-interpreter ${GLIBCDIR}/lib/ld-linux-x86-64.so.2 ${GCCDIR}/bin/gcc-9.2
    
    • 1
  2. Best Answer
    Ashfaqur Rahaman
    2020-02-15T00:00:33+08:002020-02-15T00:00:33+08:00

    根据GNU 构建系统中的Autoconf 手册,编译器/链接器标志/选项通过配置脚本传递。所以就我而言,我应该通过以下方式配置、编译和安装:

    $ GLIBCDIR=/home/sfinix/programming/repos/glibc/glibc-install/
    $ LDFLAGS="-Wl,-q"
    $ CFLAGS="-L ${GLIBCDIR}/lib -I ${GLIBCDIR}/include -Wl,--rpath=${GLIBCDIR}/lib -Wl,--dynamic-linker=${GLIBCDIR}/lib/ld-linux-x86-64.so.2"
    $ mkdir ~/gcc-build
    $ cd ~/gcc-build'
    $ ~/gcc-src/configure --prefix=~/gcc-install CFLAGS=${CFLAGS} CXXFLAGS=${CFLAGS} LDFLAGS=${LDFLAGS}
    $ make && make install
    

    在配置脚本中,我只传递了与所问问题相关的变量/选项。您可能希望根据您的特定需求传递更多选项。您可以通过运行查看所有选项和接受的变量~/gcc-src/configure --help。您还可以通过环境变量传递标志,但您必须在运行配置脚本之前设置它们。

    • 0

相关问题

  • 从源代码编译时应该何时构建“lib”和“include”目录?

  • 创建一个多脚本 bash 脚本,该脚本已编译并保留日志

  • Meson 找不到 Boost 库

  • 如何在 Gentoo Linux 系统上高效地重新编译所有内容?

  • 自编译 OpenVPN 不会从 systemd 启动

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve