Как связать объект с основным в нем? - PullRequest
0 голосов
/ 31 января 2019

Я хотел бы связать объектный файл (.o файл) с main() с другим объектным файлом, который также имеет main().

Я бы хотел игнорировать main() во втором файле, но используйте main() во втором .o файле.Есть ли способ сделать это?Спасибо.

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Предположим, что двумя объектными файлами являются a.o и b.o.Оба файла имеют main(), но вы хотите использовать только main() из a.o.

. Сначала вы должны найти точное имя функции (это необходимо в случае, если имя искажено или_ предварительно).

Выполнить -

objdump -t | grep "main"

Это покажет символ, содержащий слово main.Выберите подходящее имя функции.Теперь мы переименуем его в другое имя -

objcopy --redefine-sym main=some_rubbish_name_not_anywhere b.o

(замените main на любое имя символа, которое вы получили в приведенной выше команде)

Теперь вы можете связывать свои объектные файлы, как обычно, -

clang a.o b.o -o program

Другим способом будет полное удаление символа main с b.o (как предложено @ChrisBodd в комментариях) -

objcopy --strip-symbol=main b.o
0 голосов
/ 31 января 2019

У компоновщика GNU есть опция --allow-multiple-definition.Когда это используется, ld игнорирует любые повторяющиеся определения, используя только первое, которое встречается для каждого символа.Это относится к определениям всех символов, конечно, не только main.Чтобы использовать это через драйвер gcc, вы должны использовать опцию gcc -Wl,:

gcc -o myprog -Wl,--allow-multiple-definition main.o second.o
...