Создание простого ( hello-world-esque) пример использования опции ld -rpath с $ ORIGIN

Примечание: Полный рабочий пример теперь ниже. Исходный вопрос следует:

У меня проблемы с использованием параметра ld -rpath с $ ORIGIN .
Поскольку мне не удалось найти полный пример, я подумал, что попробую написать его сам, чтобы я и другие могли использовать его позже. Как только он заработает, я приберу его.

Я спрашивал об этом раньше , но я думаю, что мой пост был немного запутанным.

Пример проекта строит одну общую библиотеку и один исполняемый файл, которые связаны с указанной библиотекой.
Он очень маленький (3 файла, 22 строки, включая скрипт сборки).
Вы можете скачать проект с здесь


Файловая структура (перед сборкой):

  • project /
    • src /
      • foo.cpp
      • main.cpp
    • make.sh

] project / src / foo.cpp


int foo()
  { return 3; }

project / src / main.cpp


int foo();

#include 
int main()
  {
    std::cout << foo() << std::endl;
    return 0;
  }

project / make.sh


# Make directories:
mkdir -p -v obj
mkdir -p -v lib
mkdir -p -v run

# Build the library:
g++ -c -o obj/foo.o src/foo.cpp -fPIC
g++ -shared -o lib/foo.sh obj/foo.o

# Build the executable:
g++ -c -o obj/main.o src/main.cpp
g++ -o run/main.run obj/main.o -Wl,-rpath,'$ORIGIN/../../lib' -Llib -l:foo.sh

Из каталога project запустите make.sh (убедитесь, что он исполняемый).


Структура файла (после сборки):

  • project /
    • src /
      • foo.cpp
      • main.cpp
    • obj /
      • foo.o
      • main.o
    • lib /
      • foo.so
    • run /
      • main.run
    • make.sh

run / main.run теперь должен загрузить ] lib / foo.sh при выполнении из любого места.


Проблемы

В настоящее время это работает только частично.
Файлы компилируются и связываются нормально, но не удается установить ссылку при запуске из любого каталога, кроме project (который является точкой упражнения).

Проверка main.run с помощью readelf -d показывает:
0x0000000000000001 (НЕОБХОДИМО) Общая библиотека: [lib / foo.sh]
0x000000000000000f (RPATH) Путь к библиотеке: [$ ORIGIN /../../ lib] Что выглядит очень близко (я бы предпочел [foo.sh] , чем [lib / foo.sh] , но я исправлю это позже).

КРАТКОЕ ОПИСАНИЕ ] $ ORIGIN в -Wl, -rpath, '$ ORIGIN /../../ lib' означает project / run / main.run , поэтому этот rpath должен стать project / lib .

Я пробовал $ ORIGIN / .. , $ ORIGIN /../ lib , $ ORIGIN / .. /.. , $ ORIGIN /../../ lib безрезультатно.

Примечание: я использую -l: , который требует полной библиотеки имя файла (среди прочего, проще написать сценарий с переменными, когда все функции имеют одинаковый формат имени).

Кто-нибудь знает, почему это не работает?
Или, наоборот, есть ли у кого-нибудь или знает полный рабочий пример?

16
задан Community 23 May 2017 в 11:45
поделиться