rpath = $ ORIGIN не имеет желаемого эффекта? - PullRequest
21 голосов
/ 12 июня 2011

У меня есть двоичный "CeeloPartyServer", который должен найти libFoundation.so во время выполнения на машине с FreeBSD. Они оба в одном каталоге. Я компилирую (на другой платформе, используя кросс-компилятор) CeeloPartyServer, используя флаг компоновщика "-rpath = $ ORIGIN".

> readelf -d CeeloPartyServer |grep -i rpath
 0x0000000f (RPATH)                      Library rpath: [$ORIGIN]
> ls
CeeloPartyServer    Contents        Foundation.framework    libFoundation.so
> ./CeeloPartyServer 
/libexec/ld-elf.so.1: Shared object "libFoundation.so" not found, required by "CeeloPartyServer"

Почему она не находит библиотеку, когда я пытаюсь ее запустить? Моя точная строка компоновщика: -lm -lmysql -rpath = $ ORIGIN. Я почти уверен, что мне не нужно избегать \ $ или чего-то подобного, так как мой анализ readelf действительно показывает, что для библиотеки rpath установлено значение $ ORIGIN. Чего мне не хватает?

Ответы [ 3 ]

38 голосов
/ 13 июня 2011

Я предполагаю, что вы используете gcc и binutils.

Если вы сделаете

readelf -d CeeloPartyServer | grep ORIGIN

Вы должны вернуть строку RPATH, которую вы нашли выше, но вы также должны увидеть некоторые записио флагах.Следующее - из библиотеки, которую я построил.

0x000000000000000f (RPATH)              Library rpath: [$ORIGIN/../lib]
0x000000000000001e (FLAGS)              ORIGIN
0x000000006ffffffb (FLAGS_1)            Flags: ORIGIN

Если вы не видите какие-либо записи FLAGS, вы, вероятно, не сказали компоновщику пометить объект как требующий обработки источника.С binutils ld вы делаете это, передавая флаг -z origin.

Я предполагаю, что вы используете gcc для управления ссылкой, поэтому в этом случае вам нужно будет передать флаг через компилятор, добавив-Wl,-z,origin к вашей линии связи gcc.

11 голосов
/ 15 июня 2011

В зависимости от того, сколько слоев этот флаг проходит до того, как компоновщик его увидит, вам может понадобиться использовать $$ORIGIN или даже \$$ORIGIN. Вы будете знать, что у вас все правильно, когда readelf показывает заголовок RPATH, который выглядит как $ORIGIN/../lib или похожий. Дополнительный $ и обратный слеш предназначены только для предотвращения обработки $ другими инструментами в цепочке.

1 голос
/ 28 июня 2016

\ $ \ ORIGIN, если вы используете chrpath и \ $ \ $ ORIGIN, если вы предоставляете напрямую в LDFLAGS

...