«gcc -lXext» завершается успешно, но libXext не связан - PullRequest
0 голосов
/ 23 октября 2011

Двоичный файл был связан с gcc, используя:

gcc notion.o -Wl,-whole-archive ../ioncore/ioncore.a -Wl,-no-whole-archive -L/usr/X11R6/lib -lX11 -lXext -lSM -lICE -Wl,-whole-archive -L../libmainloop -lmainloop -lextl -ltu -Wl,-no-whole-archive <code>pkg-config --libs lua5.1 -ldl -lm -lrt -Xlinker --export-dynamic -o понятие

Связывание выполнено успешно - однако при запуске приложения пользователь сообщает о сбое из-за неопределенного символа (XShapeCombineRectangles). XShapeCombineRectangles должно быть доступно в libXext.

Действительно, при проверке с помощью 'ldd' Xext не указан как зависимость для общей библиотеки для этого пользователя:

linux-gate.so.1 => (0x0068f000)
libX11.so.6 => /usr/lib/i386-linux-gnu/libX11.so.6 (0x00ec7000)
liblua5.1.so.0 => /usr/lib/i386-linux-gnu/liblua5.1.so.0
(0x00226000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x005da000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x005e1000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x0032c000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00335000)
libxcb.so.1 => /usr/lib/i386-linux-gnu/libxcb.so.1 (0x007d6000)
/lib/ld-linux.so.2 (0x00882000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0
(0x006dc000)
libXau.so.6 => /usr/lib/i386-linux-gnu/libXau.so.6 (0x00110000)
libXdmcp.so.6 => /usr/lib/i386-linux-gnu/libXdmcp.so.6
(0x00dd8000)

Когда я сам компилирую приложение, ldd показывает libXext и действительно не вылетает.

Что здесь может происходить?

(Больше контекста: об этой ошибке сообщили в http://sourceforge.net/tracker/?func=detail&aid=3427206&group_id=314802&atid=1324528)

1 Ответ

2 голосов
/ 23 октября 2011

Вероятно, ваш компоновщик (или gcc) автоматически добавляет --as-needed за кулисы, и в вашей системе XShapeCombineRectangles поступает из некоторой библиотеки , отличной , чем libXext.

YouВы можете узнать, какая библиотека определяет символ XShapeCombineRectangles в вашей ссылке: просто добавьте -Wl,-y,XShapeCombineRectangles к вашей строке ссылки.

Добавление -v покажет, используются ли какие-либо аргументы --as-needed или нет.

Возможно, вы сможете заставить конечный исполняемый файл ссылаться на libXext, добавив -Wl,--no-as-needed,-lXext к строке ссылки.

Обновление : я неправильно понял вопрос (и высформулировал это очень плохо).

Чтобы переформулировать:

  1. приложение связывается и корректно работает в системе OPs, а ldd<br> app показывает зависимость от libXext
  2. приложение также правильно связывается и запускается в системе конечного пользователя, но ldd app показывает , а не показывает libXext
  3. , когда приложение пытается dlopen("de.so", ...) в системе конечного пользователя.de.so: undefined symbol XShapeCombineRectangles

Если вышеуказанные пункты соответствуютт. е. вполне вероятно, что

  1. Система конечного пользователя имеет libXext.a, но не libXext.so
  2. Основное приложение не вызывает XShapeCombineRectangles, только код в de.so делает
  3. Когда de.so связан, нет -lXext на его линии связи.

Либо установка libXext.so, либо связываниеОсновное приложение с -u XShapeCombineRectangles, скорее всего, решит проблему.

Чтобы понять проблему, вы можете прочитать this .

Я предполагаю, что XShapeCombineRectanglesне ссылается на основной исполняемый файл, следовательно, не извлекается из libXext.a "книжной полки", следовательно, не экспортируется из основного исполняемого файла, несмотря на --export-dynamic.

...