Rpath = $ORIGIN не имеет желаемого эффекта?

У меня есть двоичный "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. Я уверен, что мне не нужно бежать\$или что-то в этом роде, так как мой анализ на самом деле показывает, что для библиотеки rpath установлено значение $ORIGIN. Что мне не хватает?

Ответы

Ответ 1

Я предполагаю, что вы используете 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.

Ответ 2

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

Ответ 3

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