Re: Вопрос по GNU ld:

Defolt1

Есть программа на C и есть объектник X, с которым она компилируется. Есть ошибка
ld про multiple definition, причём в случае дублирования линкер считает верным
определение символа из X, а не из скомпилированной программы.
Требуется подавить ошибки multiple definition, заставив ld считать верным
определение символа из программы, а не из X.

sergey_m

А что мешает переименовать символ в программе?

ppplva

Нужно, чтобы работало как с X, так и без него ?
void f __attribute__ weak;  

Нет, не понял. Как это - "в случае ошибки считает верным" ? В случае ошибки он ругается и выходит.

ppplva

О! объяви его static.
Или ручками поставь weak в X.

Defolt1

Дело в том, что нельзя трогать исходный текст: на самом деле программа на C не
одна, а их потенциальная бесконечность.
Задача в том, что с имеющимся объектником нужно уметь компилировать всякие
разные C-исходники, при этом задавая вручную, откуда линкер будет брать
определения повторяющихся символов, буде таковые появляются: из
скомпилированного C-кода или же из объектника.
(Без объектника любой C-код, имеющий отношение к описываемой задаче, не должен
скомпилиться, так как объектник предоставляет некие ресурсы).

sergey_m

Может символы, которые могут повторяться вынести в отдельный объектник? И его не линковать, а подгружать динамически?

Defolt1

1. Исходники С-программы нельзя менять руками. Нужно разруливать повторения
автоматически, линкером, наверное.
2. Исходного кода объектника X просто нет.
(Рамки ситуации довольно узкие, потому и спрошиваю у вас).

sergey_m

Делать замены в исходниках с помощью sed, что бы не было совпадающих символов?

Defolt1

1. Набор объектов, которые нужно будет переименовать, может быть разный для
разных программ, с которыми линкуется X. Поэтому sed до линковки не знает, какие
именно объекты переименовывать.
Разве что использовать список ошибок линковки, чтобы sed'ом, исходя из этого
списка, переименовать объекты и ещё раз скомпилировать программу. Но это стрёмно
как-то.
2. Кстати, динамическая библиотека не покатит: целевая платформа - msp430.

ppplva

С помощью objdump выявить все совпадающие символы, по каждому принять решение.
С помощью утилиты, имени которой я не знаю (но она есть ) сделать часть символов weak или вообще удалить/переименовать.

duantusova

Мне казалось, что выбираемый символ зависит просто от порядка в котором объектники передаются линкеру. Вот и man что-то похожее говорит.

--allow-multiple-definition
-z muldefs
Normally when a symbol is defined multiple times, the linker will
report a fatal error. These options allow multiple definitions and
the first definition will be used.
Оставить комментарий
Имя или ник:
Комментарий: