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