Изменение вторичной зависимости Binutils - PullRequest
0 голосов
/ 04 октября 2018

У меня есть проект CMake.

Кажется, что вторичное управление зависимостями варьируется от одного дистрибутива GNU / Linux к другому при сборке с CMAKE_BUILD_WITH_INSTALL_RPATH TRUE
(tldr: мне нужно повторно использовать двоичные файлы дерева сборки(например, CMake C ++ / Swig -> генерация собственного пакета Python))

Вот пример для воспроизведения ошибки (ссылка на git repo ниже):

Сначала целевые зависимости:
Foo: # нет зависимостей
FooBar: PRIVATE Foo # Foo - это , а не , упомянутый публично, включает
FooBarApp: FooBar # Не использует напрямую Foo

Таким образом, исполняемый файл FooBarApp зависит только от библиотеки FooBar, которая "конфиденциально" зависит от библиотеки Foo.

Итак, я хочу, чтобы двоичные файлы имели:
Foo: no runpath
FooBar: runpath: [$ORIGIN] и DT_NEEDED: [libFoo.so]
FooBarApp: runpath: [$ORIGIN/../lib] и DT_NEEDED: [libFooBar.so]
примечание: я опускаю другие DT_NEEDED (например, libstdc++.so.6) для ясности

Проблема в том, что это, кажется, прекрасно работает только с binutils >= 2.30 (например, debian-9, alpine, ubuntu-18.04).
В противном случае этап связыванияиз FooBarApp жалуется на то, что не находит символы libFoo.so (там, где он вообще его не видит !!!)

cmake -H. -Bbuild
cmake --build build
....
[ 83%] Linking CXX executable ../bin/FooBarApp
cd /project/cache/ubuntu-16.04/build/FooBarApp && /usr/bin/cmake -E 
cmake_link_script CMakeFiles/FooBarApp.dir/link.txt --verbose=1
/usr/bin/c++ CMakeFiles/FooBarApp.dir/src/main.cpp.o -o ../bin/FooBarApp ../lib/libFooBar.so -Wl,-rpath,"\$ORIGIN/../lib"
/usr/bin/ld: warning: libFoo.so, needed by ../lib/libFooBar.so, not found (try using -rpath or -rpath-link)
../lib/libFooBar.so: undefined reference to `foo::Foo::Hello(int)'
collect2: error: ld returned 1 exit status
FooBarApp/CMakeFiles/FooBarApp.dir/build.make:98: recipe for target 'bin/FooBarApp' failed

1) Я не нашел почему (журнал изменений, заметки о выпуске ...)в binutils.

2) Кроме того, какие параметры я должен использовать в CMakeLists.txt, чтобы гарантировать работу чего-либо даже с binutils < 2.30?

Ниже приведен пример, который воспроизводит ошибку (или работать) в различных дистрибутивах (Makefile используется только для организации вызовов Docker ...).
src: https://github.com/Mizux/SecondaryDependency
Пожалуйста, посмотрите журналы Travis-CI https://travis -ci.ком / Mizux / SecondaryDependency

...