簡體   English   中英

用 musl 編譯給出:'錯誤重定位 - secure_getenv:找不到符號'

[英]Compiling with musl gives: 'Error relocating - secure_getenv: symbol not found'

我正在嘗試在 x86_64 Debian 上使用musl 工具鏈v1.2.1 編譯一個簡單的 C 程序。

程序secgetenv.c如下:

#define _GNU_SOURCE
#include <stdlib.h> 
#include <stdio.h>

int main()
{
    char *res;

    res = secure_getenv("TEST_ENV_VAR");

    fprintf(stdout, "%s\n", res);

    return 0;
}

編譯執行沒有錯誤。 但是運行ldd顯示沒有找到符號secure_getenv

$ musl-ldd secgetenv-musl 
    /lib/ld-musl-x86_64.so.1 (0x7f7872779000)
    libc.so => /lib/ld-musl-x86_64.so.1 (0x7f7872779000)
Error relocating secgetenv-musl: secure_getenv: symbol not found

musl 在較早的補丁中添加了對secure_getenv支持,我確實在/usr/local/x86_64-linux-musl/include/stdlib.h看到了一個聲明:

#ifdef _GNU_SOURCE
...
char *secure_getenv(const char *);
...
#endif

src/env/secure_getenv.c有相應的定義:

#define _GNU_SOURCE
#include <stdlib.h>
#include "libc.h"

char *secure_getenv(const char *name)
{
    return libc.secure ? NULL : getenv(name);
}

此外,musl 的libc.so具有定義的符號:

$ readelf -s /usr/local/x86_64-linux-musl/lib/libc.so | grep secure
  1461: 0000000000020e0d    17 FUNC    GLOBAL DEFAULT    8 secure_getenv
   358: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS secure_getenv.c
  2275: 0000000000020e0d    17 FUNC    GLOBAL DEFAULT    8 secure_getenv

我嘗試將LD_LIBRARY_PATH設置為指向/usr/local/x86_64-linux-musl/lib (musl 的 libc 所在的位置),但這似乎沒有解決任何問題。 我嘗試了一些其他編譯器選項,但似乎沒有任何解決方法。 難道我做錯了什么? 我該如何解決這個問題?


我認為如果我添加了我的編譯方式可能會有用,所以這里是詳細的輸出:

$ /usr/local/bin/x86_64-linux-musl-gcc -v -o secgetenv-musl secgetenv.c -fPIC -ggdb
Using built-in specs.
COLLECT_GCC=/usr/local/bin/x86_64-linux-musl-gcc
COLLECT_LTO_WRAPPER=/usr/local/bin/../libexec/gcc/x86_64-linux-musl/9.2.0/lto-wrapper
Target: x86_64-linux-musl
Configured with: ../src_gcc/configure --enable-languages=c,c++ --enable-languages=c,c++ --enable-default-pie --disable-bootstrap --disable-assembly --disable-werror --target=x86_64-linux-musl --prefix= --libdir=/lib --disable-multilib --with-sysroot=/x86_64-linux-musl --enable-tls --disable-libmudflap --disable-libsanitizer --disable-gnu-indirect-function --disable-libmpx --enable-libstdcxx-time=rt --with-build-sysroot=/home/<user>/musl-cross-make/build/local/x86_64-linux-musl/obj_sysroot AR_FOR_TARGET=/home/<user>/musl-cross-make/build/local/x86_64-linux-musl/obj_binutils/binutils/ar AS_FOR_TARGET=/home/<user>/musl-cross-make/build/local/x86_64-linux-musl/obj_binutils/gas/as-new LD_FOR_TARGET=/home/<user>/musl-cross-make/build/local/x86_64-linux-musl/obj_binutils/ld/ld-new NM_FOR_TARGET=/home/<user>/musl-cross-make/build/local/x86_64-linux-musl/obj_binutils/binutils/nm-new OBJCOPY_FOR_TARGET=/home/<user>/musl-cross-make/build/local/x86_64-linux-musl/obj_binutils/binutils/objcopy OBJDUMP_FOR_TARGET=/home/<user>/musl-cross-make/build/local/x86_64-linux-musl/obj_binutils/binutils/objdump RANLIB_FOR_TARGET=/home/<user>/musl-cross-make/build/local/x86_64-linux-musl/obj_binutils/binutils/ranlib READELF_FOR_TARGET=/home/<user>/musl-cross-make/build/local/x86_64-linux-musl/obj_binutils/binutils/readelf STRIP_FOR_TARGET=/home/<user>/musl-cross-make/build/local/x86_64-linux-musl/obj_binutils/binutils/strip-new --build=x86_64-pc-linux-gnu --host=x86_64-pc-linux-gnu
Thread model: posix
gcc version 9.2.0 (GCC) 
COLLECT_GCC_OPTIONS='-v' '-o' 'secgetenv-musl' '-fPIC' '-ggdb' '-mtune=generic' '-march=x86-64'
 /usr/local/bin/../libexec/gcc/x86_64-linux-musl/9.2.0/cc1 -quiet -v -iprefix /usr/local/bin/../lib/gcc/x86_64-linux-musl/9.2.0/ -isysroot /usr/local/bin/../x86_64-linux-musl secgetenv.c -quiet -dumpbase secgetenv.c -mtune=generic -march=x86-64 -auxbase secgetenv -ggdb -version -fPIC -o /tmp/cczjeoUa.s
GNU C17 (GCC) version 9.2.0 (x86_64-linux-musl)
    compiled by GNU C version 8.3.0, GMP version 6.1.2, MPFR version 4.0.2, MPC version 1.1.0, isl version none
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
ignoring nonexistent directory "/usr/local/bin/../x86_64-linux-musl/usr/local/include"
ignoring duplicate directory "/usr/local/bin/../lib/gcc/../../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/include"
ignoring nonexistent directory "/usr/local/bin/../x86_64-linux-musl/usr/include"
ignoring duplicate directory "/usr/local/bin/../lib/gcc/../../lib/gcc/x86_64-linux-musl/9.2.0/include"
#include "..." search starts here:
#include <...> search starts here:
 /usr/local/bin/../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/include
 /usr/local/bin/../lib/gcc/x86_64-linux-musl/9.2.0/include
End of search list.
GNU C17 (GCC) version 9.2.0 (x86_64-linux-musl)
    compiled by GNU C version 8.3.0, GMP version 6.1.2, MPFR version 4.0.2, MPC version 1.1.0, isl version none
GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
Compiler executable checksum: 02d33dfe51251a8723bc0ce5bbca8406
COLLECT_GCC_OPTIONS='-v' '-o' 'secgetenv-musl' '-fPIC' '-ggdb' '-mtune=generic' '-march=x86-64'
 /usr/local/bin/../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/bin/as -v --64 -o /tmp/ccMKBInY.o /tmp/cczjeoUa.s
GNU assembler version 2.33.1 (x86_64-linux-musl) using BFD version (GNU Binutils) 2.33.1
COMPILER_PATH=/usr/local/bin/../libexec/gcc/x86_64-linux-musl/9.2.0/:/usr/local/bin/../libexec/gcc/:/usr/local/bin/../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/bin/
LIBRARY_PATH=/usr/local/bin/../lib/gcc/x86_64-linux-musl/9.2.0/:/usr/local/bin/../lib/gcc/:/usr/local/bin/../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/lib/:/usr/local/bin/../x86_64-linux-musl/lib/
COLLECT_GCC_OPTIONS='-v' '-o' 'secgetenv-musl' '-fPIC' '-ggdb' '-mtune=generic' '-march=x86-64'
 /usr/local/bin/../libexec/gcc/x86_64-linux-musl/9.2.0/collect2 -plugin /usr/local/bin/../libexec/gcc/x86_64-linux-musl/9.2.0/liblto_plugin.so -plugin-opt=/usr/local/bin/../libexec/gcc/x86_64-linux-musl/9.2.0/lto-wrapper -plugin-opt=-fresolution=/tmp/ccjHWTRL.res -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=-lgcc -plugin-opt=-pass-through=-lgcc_s --sysroot=/usr/local/bin/../x86_64-linux-musl --eh-frame-hdr -m elf_x86_64 -dynamic-linker /lib/ld-musl-x86_64.so.1 -pie -o secgetenv-musl /usr/local/bin/../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/lib/Scrt1.o /usr/local/bin/../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/lib/crti.o /usr/local/bin/../lib/gcc/x86_64-linux-musl/9.2.0/crtbeginS.o -L/usr/local/bin/../lib/gcc/x86_64-linux-musl/9.2.0 -L/usr/local/bin/../lib/gcc -L/usr/local/bin/../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/lib -L/usr/local/bin/../x86_64-linux-musl/lib /tmp/ccMKBInY.o -lgcc --push-state --as-needed -lgcc_s --pop-state -lc -lgcc --push-state --as-needed -lgcc_s --pop-state /usr/local/bin/../lib/gcc/x86_64-linux-musl/9.2.0/crtendS.o /usr/local/bin/../lib/gcc/x86_64-linux-musl/9.2.0/../../../../x86_64-linux-musl/lib/crtn.o
COLLECT_GCC_OPTIONS='-v' '-o' 'secgetenv-musl' '-fPIC' '-ggdb' '-mtune=generic' '-march=x86-64'

但是運行 ldd 顯示沒有找到符號 secure_getenv :

 $ musl-ldd secgetenv-musl /lib/ld-musl-x86_64.so.1 (0x7f7872779000) libc.so => /lib/ld-musl-x86_64.so.1 (0x7f7872779000) Error relocating secgetenv-musl: secure_getenv: symbol not found

ldd 似乎揭示的不僅僅是未找到該符號。 這似乎表明某些東西,也許是musl-ldd本身,已嚴重損壞。 輸出表明libc.so不是解析為 MUSL 的 libc,甚至不是系統的默認 libc,而是解析為 MUSL 的運行時動態鏈接器。 自然,這不提供想要的符號本身。

如果盡管有來自musl-ldd的抱怨,程序musl-ldd預期運行,那么問題很可能出在musl-ldd 如果程序未按預期運行(可能在您嘗試時報告相同的重定位錯誤),則問題可能出在您的 MUSL 副本中,特別是在其運行時動態鏈接器 /lib/ld-musl-x86_64.so 中。 1.

附錄:

假設對這個答案的評論是正確的,即 MUSL 程序解釋器包含 C 庫的副本,那么這里仍然存在嚴重問題,無論是在musl-ldd還是在您的庫副本中,特別是在/lib/ld-musl-x86_64.so.1 例如,后者可能與庫不同步。 可能出現此類問題的原因可能是同時存在兩個或多個不同 MUSL 安裝的組件,或者 MUSL 編譯器工具鏈與已安裝的 MUSL 版本不同步。

/lib/ld-musl-x86_64.so.1鏈接到/lib/x86_64-linux-musl/libc.so沒有定義符號。 這個 libc 是在我安裝 musl-tools 或類似的東西時引入的。 它使用 musl 版本 1.1.21,該版本沒有消除此錯誤所需secure_getenv補丁 將 ld 符號libc.so到更新的 musl libc.so ,我在安裝 musl-cross-make 時得到了解決我的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM