簡體   English   中英

aarch64 動態 linker rpath 使用與輔助依賴鏈接

[英]aarch64 dynamic linker rpath usage with secondary dependency linking

我有兩個共享庫:liba 和 libb,其中 libb 依賴於 liba 和一個使用 libb 的可執行文件。 我在使用 CMake 為 aarch64 架構構建項目時遇到了問題,而主機工具鏈一切正常。 該項目如下所示:

├── CMakeLists.txt
├── liba
│   └── main.cpp
├── libb
│   └── main.cpp
└── main
    └── main.cpp

CMakeLists.txt 內容如下:

cmake_minimum_required(VERSION 3.15)
project(my_proj CXX)

add_library(a SHARED liba/main.cpp)
set_property(TARGET a PROPERTY LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/a")
add_library(b SHARED libb/main.cpp)
set_property(TARGET b PROPERTY LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/b")
target_link_libraries(b PRIVATE a)

add_executable(main main/main.cpp)
target_link_libraries(main b)

我的主機 g++/ld 編譯器/鏈接器一切正常。 但是,當我嘗試使用 ARM 編譯器構建項目時,出現 linker 錯誤:

$ cmake .. -DCMAKE_CXX_COMPILER=aarch64-linux-gnu-g++
-- The CXX compiler identification is GNU 9.2.0
-- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g++
-- Check for working CXX compiler: /usr/bin/aarch64-linux-gnu-g++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /home/icblnk/tmp/rm/test/build
$ make
Scanning dependencies of target a
[ 16%] Building CXX object CMakeFiles/a.dir/liba/main.cpp.o
[ 33%] Linking CXX shared library a/liba.so
[ 33%] Built target a
Scanning dependencies of target b
[ 50%] Building CXX object CMakeFiles/b.dir/libb/main.cpp.o
[ 66%] Linking CXX shared library b/libb.so
[ 66%] Built target b
Scanning dependencies of target main
[ 83%] Building CXX object CMakeFiles/main.dir/main/main.cpp.o
[100%] Linking CXX executable main
/usr/lib/gcc/aarch64-linux-gnu/9.2.0/../../../../aarch64-linux-gnu/bin/ld: warning: liba.so, needed by b/libb.so, not found (try using -rpath or -rpath-link)
/usr/lib/gcc/aarch64-linux-gnu/9.2.0/../../../../aarch64-linux-gnu/bin/ld: b/libb.so: undefined reference to `function_liba_1()'
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/main.dir/build.make:85: main] Error 1
make[1]: *** [CMakeFiles/Makefile2:78: CMakeFiles/main.dir/all] Error 2
make: *** [Makefile:84: all] Error 2

問題是 CMake 使用rpath ELF 條目來查找PRIVATE庫,由於某種原因,這在 ARM 的 linker 的情況下不起作用。 我試圖研究可能的 linker 選項,但沒有找到任何有用的東西。

我在示例中使用的編譯器/鏈接器版本:

$ ld --version
GNU ld (GNU Binutils) 2.32
$ aarch64-linux-gnu-ld --version
GNU ld (GNU Binutils) 2.32
$ g++ --version
g++ (GCC) 9.2.0
$ aarch64-linux-gnu-g++ --version
aarch64-linux-gnu-g++ (GCC) 9.2.0

交叉編譯導致鏈接失敗,因為隱式指定了sysroot ,因此當ld嘗試使用rpath查找依賴項時,它還會在其前面添加sysroot 該問題已在e0f735f8f53543773f01a4f692609d1b23fd3621中修復,並且自 CMake 3.16.0 起包含該修復程序。 所以現在 CMake 還為私有依賴添加了 -rpath -rpath-link

暫無
暫無

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

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