Предотвращение удаления символов в IBM Visual Age C / C ++ для AIX - PullRequest
0 голосов
/ 03 мая 2010

Я создаю разделяемую библиотеку, которую динамически загружаю (используя dlopen) в свое приложение AIX, используя компилятор IBM VisualAge C / C ++.К сожалению, кажется, что он удаляет необходимые символы:

rtld: 0712-002 fatal error: exiting.
rtld: 0712-001 Symbol setVersion__Q2_3CIF17VersionReporterFRCQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__ was referenced
from module ./object/AIX-6.1-ppc/plugins/plugin.so(), but a runtime definition
of the symbol was not found.

И общая библиотека, и приложение, которое загружает компиляцию / ссылку общей библиотеки в статическую библиотеку, которая содержит VersionReporter, упомянутый в сообщении об ошибке.

Чтобы связать общую библиотеку, я использую следующие параметры: -bM: SRE -bnoentry -bexpall Чтобы связать приложение, я использую эту опцию: -brtl

Есть ли опция Iможно использовать для предотвращения удаления этого символа в приложении?Я пытался использовать -nogc, как указано в документации IBM, но это приводит к тому, что разделяемая библиотека имеет недопустимый формат или приложение не может установить связь (в зависимости от того, с кем я ее использую).

Ответы [ 2 ]

1 голос
/ 15 мая 2010

Да. Это на самом деле не связано с конкретным языком или компилятором. Та же самая общая техника используется для gcc, например. -bI: foo.exp используется, чтобы сообщить компоновщику, что символы, перечисленные в foo.exp, будут взяты из имени вверху. Аналогично, -BE: dog.exp используется, чтобы сообщить компоновщику, что символы, перечисленные в dog.exp, экспортированы и могут использоваться другими.

Вы можете увидеть, что / bin / ldd и / bin / dump могут использоваться для просмотра этих символов.

0 голосов
/ 04 мая 2010

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

# version.exp:
setVersion__Q2_3CIF17VersionReporterFRCQ2_3std12basic_stringXTcTQ2_3std11char_traitsXTc_TQ2_3std9allocatorXTc__

А затем при связывании приложения используйте: -brtl -bexpfull -bE: version.exp

Здесь больше информации: Разработка и портирование приложений C и C ++ для AIX .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...