2016-01-19 3 views
6

У меня есть код C++ 14, который должен загружать произвольный файл общих объектов с помощью dlopen. К сожалению, в некоторых системах (например, мой archlinux, как сообщается, также относится к некоторым .so на ubuntu и gentoo), эти so-файлы могут быть «GNU ld scripts» вместо реальных двоичных файлов.Загрузка скрипта GNU ld с dlopen

Для справки, здесь содержание моего /usr/lib/libm.so:

/* GNU ld script 
*/ 
OUTPUT_FORMAT(elf64-x86-64) 
GROUP (/usr/lib/libm.so.6 AS_NEEDED (/usr/lib/libmvec.so.1)) 

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

Есть ли чистый способ реализовать этот случай? Честно говоря, я озадачен тем, почему dlopen на самом деле не справляется с этими переменами.

Примечание. Учитывая вышеупомянутые исправления, я думаю, что это не просто проблема с моей конфигурацией/версией системы. Если это должно работать готово с dlopen (ошибка вместо отсутствующей функции), пожалуйста, дайте мне знать.

+0

Является ли ваш ld.so достаточно недавним? – marcolz

+0

Не относится к определенному языку, но о загрузке/привязке. – Olaf

+0

@Olaf Я ищу решение, которое я могу использовать в своей программе на C++. Поскольку я загружаю библиотеку во время выполнения с использованием кода C++/C, я считаю это связанным. – Zulan

ответ

4

Сценарии компоновщика предназначены для использования компоновщиком, а не компоновщиком времени выполнения.

GNU ld script Комментарий должен быть подарком: для ld, а не для ld.so. ;-)

Смотрите, например: http://www.math.utah.edu/docs/info/ld_3.html

Так что я думаю, используя это с dlopen() означал бы имитируя/импортирование части магии ld «s для этого, что бы подтвердить свои опасения относительно обращения вручную разбора текста и сохраняя ужасно злой код.

EDIT: Там, кажется, одна вещь, которая может помочь вам, хотя:

https://www.sourceware.org/ml/libc-alpha/2011-07/msg00152.html

<gnu/lib-names.h> должен содержать определения LIBM_SO, который укажет вам на правильный файл, который вы можете dlopen().

Это означает, что, как правило, никакого злого кода не потребуется.

+0

Хотя это было не то, что я надеялся/искал, редактирование действительно полезно. Хотя он не справляется с проблемой прозрачно и перемещает решение по коду вызывающего абонента, он чист и избавляет меня от ужасов. – Zulan

Смежные вопросы