LINUX.ORG.RU

[ld] Игнорировать undefined reference по списку

 


0

1

Требуется при линковке программы игнорировать некоторые undefined symbols. При этом, на другие undefined symbols (вне указанного списка) надо выдавать ошибку.

Т.е. по сути нужно, чтобы линковщик «увидел» виртуальную разделяемую библиотеку. Библиотеки самой нет, а символы из неё — есть.

Как?

А если взять и тупо сделать разделяемую библиотеку с пустыми определениями? Если есть список символов, то в чем проблема?

provaton ★★★★★
()
Ответ на: комментарий от provaton

Я так подозреваю, тогда имя библиотеки добавится вот сюда:

Dynamic section at offset 0x40058 contains 34 entries:
  Tag        Type                         Name/Value
 0x00000001 (NEEDED)                     Shared library: [libgtk-x11-2.0.so.0]
 0x00000001 (NEEDED)                     Shared library: [libgdk-x11-2.0.so.0]
 0x00000001 (NEEDED)                     Shared library: [libgdk_pixbuf-2.0.so.0]
 0x00000001 (NEEDED)                     Shared library: [libgio-2.0.so.0]
 0x00000001 (NEEDED)                     Shared library: [libgobject-2.0.so.0]

И при загрузке получим фейл.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

> Я так подозреваю, тогда имя библиотеки добавится вот сюда

ну сделай сишник→объектник с заглушками и скорми линкеру, или я не понял проблему?

arsi ★★★★★
()
Ответ на: комментарий от kim-roader

Значит, не поддерживает...

Пичалька.

geekless ★★
() автор топика
Ответ на: комментарий от arsi

или я не понял проблему?

Представь, что ты делаешь динамически загружаемый модуль. Т.е. плагин, по сути. Плагин как обычная библиотека зависит от кучи разных библиотек. И вместе с этим он зависит от символов в программе, которая его будет вызывать.

Мы можем собрать модуль либо без контроля резолвинга символов (дефолтное поведение ld при сборке с опцией -shared). Либо мы можем собирать с контролем резолвинга (это когда ld грязно ругается по поводу undefined references, дефолтное поведение при линковке исполняемых файлов).

Мне же нужно собирать с контролем зависимостей (чтобы обнаруживать баги линковки при сборке, а не при попытке запуска модуля), КРОМЕ символов, которые резолвятся не в библиотеках, а запускающей модуль программой. (Ну то есть понятно, что ни в какой *.so этих символов нет. Их модулю предоставляет бинарник приложения.)

geekless ★★
() автор топика
Ответ на: комментарий от arsi

мсье знает толк в извращениях

Динамически загружаемые модули на ЛОРе являются извращениями. Только статика! Только хардкор!

с того, что я понял, м/б тебе помогут weak символы.

Так и говори, что ничего не понял.

geekless ★★
() автор топика
Ответ на: комментарий от geekless

а если символы из программы находить в рантайме через dlsym? Тогда плагин будет линковаться нормально.

alex_custov ★★★★★
()
Ответ на: комментарий от geekless

чтобы обнаруживать баги линковки при сборке, а не при попытке запуска модуля

Если только для этого, то в чем проблема, собирать два раза:
1й раз линковать с основной программой, обнаруживать баги и выкидывать результат
2й раз линковать уже по-настоящему, но с игнорированием всех ошибок

Это проще, чем список символов составлять.

user_2190
()
Ответ на: комментарий от user_2190

собирать два раза

К такому решению и пришел. Сделаю соответствующую обвязку и буду прогонять тестовую линковку.

geekless ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.