首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coding
V2EX  ›  C

交叉编译时,链接器无法找到到存在于 rpath 里的某个动态库的符号

  •  
  •   dangyuluo · 51 天前 · 968 次点击
    这是一个创建于 51 天前的主题,其中的信息可能已经有所发展或是发生改变。

    标题太拗口,用英语复述一下: Why cross compile linker(collector) is not able to find symbols from a shared libary whose path is already in rpath?

    问题是这样的,我们在编译一个程序的时候,报了很多undefined reference to错误。以下是最终编译命令:

    /usr/bin/aarch64-linux-gnu-g++ \
    -v \
    --sysroot=/home/john.doe/gc/sysroot_arm64v8_ubuntu_bionic \
    -frecord-gcc-switches \
    -O2 -g -DNDEBUG \
    CMakeFiles/test_rmw_impl_id_check_exe.dir/rcl/test_rmw_impl_id_check_exe.cpp.o \
    -o test_rmw_impl_id_check_exe \
    -Wl,-rpath,/path_to_lib_b... \
    ../librcl.so \
    /home/john.doe/gc/liba.so \
    -lpthread \
    -ldl \
    

    简单来讲,test_rmw_impl_id_check_exe被明文链接到liba.so,而liba.so又需要用libb.so里面的一些符号(可以从以下代码看出)

    $ readelf -g /home/john.doe/gc/liba.so | grep NEEDED
    
    0x0000000000000001 (NEEDED)             Shared library: [libb.so]
    ....
    

    可以很明显的看到libb.so的目录已经很明显地存在于rpath里了,但是 linker 死活都是找不到这些符号。请问各位大神,有什么好办法进行 debug 么?谢谢。

    3 回复  |  直到 2019-10-24 00:47:21 +08:00
        1
    dangyuluo   51 天前
    嘿,我发现用`rpath-link`的话就可以。
        2
    choury   51 天前
    rpath 是给运行时 ld 找 so 时用的,linker 只是把他写到 elf 里面,编译的时候不会关心这个路径的
        3
    dangyuluo   50 天前
    @choury 谢谢你的回复,其实这也是我的理解,直到我读到了这句话:

    Searching -rpath in this way is only supported by native linkers and cross linkers which have been configured with the --with-sysroot option.

    但是我在交叉编译,所以默认不从 rpath 寻找。不过不知道为什么链接器又不认--with-sysroot 这个参数,真是奇怪。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4312 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 35ms · UTC 06:24 · PVG 14:24 · LAX 22:24 · JFK 01:24
    ♥ Do have faith in what you're doing.