Вопрос

У меня есть двоичный файл "CeeloPartyServer", которому нужно найти libFoundation.итак, во время выполнения, на компьютере с 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.Что я упускаю из виду?

Это было полезно?

Решение

Я предполагаю, что вы используете 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 для управления ссылкой, поэтому в этом случае вам нужно будет передать flag через компилятор, добавив -Wl,-z,origin к вашей строке ссылки gcc.

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top