【问题标题】:Errors when building glibc on Alpine Linux在 Alpine Linux 上构建 glibc 时出错
【发布时间】:2019-03-17 13:10:30
【问题描述】:

我正在尝试在 Alpine Linux 上安装 glibc。我在 Docker 中运行 Alpine Linux。以下是我正在使用的步骤:

  1. docker pull alpine
  2. docker run -it alpine /bin/sh
  3. apk add --no-cache make gcc linux-headers bsd-compat-headers gawk bison binutils coreutils diffutils gettext bash grep sed texinfo perl
  4. wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz
  5. tar -xzf glibc-2.28.tar.gz
  6. cd glibc-2.28
  7. mkdir glibc-build
  8. cd glibc-build
  9. ../configure --prefix=/usr \ --disable-profile --enable-add-ons \ --libexecdir=/usr/bin --with-headers=/usr/include \ --enable-static-pie
  10. cat > /etc/ld.so.conf << "EOF"

    # Begin /etc/ld.so.conf
    
    /usr/local/lib
    /opt/lib
    
    # End /etc/ld.so.conf
    EOF
    
  11. make

  12. make install

我在 第 11 步遇到以下错误:

/usr/lib/gcc/x86_64-alpine-linux-musl/6.4.0/../../../../x86_64-alpine-linux-musl/bin/ld:找不到-lssp_nonshared

collect2: 错误:ld 返回 1 个退出状态

make[2]: *** [Makefile:129: /glibc-2.28/glibc-build/elf/sotruss-lib.so] 错误1

make[2]: 离开目录'/glibc-2.28/elf'

make[1]: *** [Makefile:258: elf/subdir_lib] 错误 2

make[1]: 离开目录'/glibc-2.28'

make: *** [Makefile:9: all] 错误 2

如果我尝试添加 --disable-shared 标志,则会出现另一个错误。

可以通过使用以下命令添加libc-dev 来解决该错误:apk add --no-cache libc-dev。但是这样我会有两个 C 库,但我需要我的应用程序专门使用 glibc

更新

如果我运行apk add --no-cache libc-devmake 命令成功通过但make install 失败并出现以下错误:

gcc 执行失败!

脚本发现你的安装有问题!

请阅读常见问题解答和自述文件并检查以下内容:

  • 您是否更改了 gcc 规范文件(从 Linux libc5)?

  • 是否有任何 libXXX.so 形式的符号链接到旧库?

    像 libm.so -> libm.so.5(其中 libm.so.5 是旧库)这样的链接是错误的,

    libm.so 应该指向新安装的 glibc 文件——而且应该有

    只有一个这样的链接(检查例如 /lib 和 /usr/lib)

你应该在你完成后从你的构建目录重新启动这个脚本 解决了所有问题!

顺便说一句。如果您安装的不是 GNU libc,则该脚本不起作用 主库!

【问题讨论】:

    标签: docker glibc alpine


    【解决方案1】:

    最后,为了在 Alpine Linux 上构建 glibc,我更改了几个步骤。

    以下是对我有用的步骤:

    1. docker pull alpine
    2. docker run -it alpine /bin/sh
    3. wget https://ftp.gnu.org/gnu/glibc/glibc-2.28.tar.gz
    4. tar -xzf glibc-2.28.tar.gz
    5. cd glibc-2.28
    6. mkdir glibc-build
    7. cd glibc-build
    8. apk add --no-cache make gcc gawk bison linux-headers libc-dev
    9. ../configure --prefix=/usr \ --disable-profile --enable-add-ons \ --libexecdir=/usr/lib --with-headers=/usr/include \ --without-cvs --enable-static-pie
    10. cat > /etc/ld.so.conf << "EOF" # Begin /etc/ld.so.conf /usr/local/lib /opt/lib /usr/lib /usr/lib64 /usr/libexec # End /etc/ld.so.conf EOF
    11. make
    12. make install

    我希望这些步骤也适用于其他所有人。

    【讨论】:

    【解决方案2】:

    安装 musl-dev 也应该可以让您克服构建错误,因此您将针对 musl 构建 glibc。

    musl-dev 包有自己的/usr/lib/libssp_nonshared.a

    https://pkgs.alpinelinux.org/contents?file=libssp_nonshared.a&path=&name=musl-dev&branch=v3.8&repo=main&arch=x86_64

    【讨论】:

    • 然后我怎样才能强制我的应用程序使用glibc 而不是musl
    • 您应该能够通过在构建期间将编译器指向 glibc 头文件位置(使用 -I / -isystem gcc 选项或类似选项),并通过指向链接器/编译器来做到这一点驱动程序到正确的库(使用rpath)进行链接,使用glibc的ld而不是默认的muslld
    猜你喜欢
    • 2012-04-08
    • 2012-08-04
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多