связывание объектных файлов и связывание статических библиотек, содержащих эти файлы - PullRequest
2 голосов
/ 24 августа 2011

Сообщество Hello Stack Overflow,

Я работаю над проектом c, чтобы чередовать несколько программ на c в один двоичный файл, который может запускать программы с чередованием в виде ступеней или вилок для целей бенчмаркинга.

Поэтому я запускаю make в каждой папке нужных программ и предварительно связываю все файлы .o с помощью «ld -r» в один новый файл .o. После этого я добавляю определенную именованную функцию к каждому из этих «больших» .o файлов, которая ничего не делает, кроме запуска main () каждой программы и предоставления argc и argv. Затем я использую objcopy для локализации всех глобальных символов, кроме неизвестных и одной из моих специфических функций, которая должна запускать main (). Наконец, я связываю эти манипулированные .o файлы вместе с моей программой, которая запускает определенные именованные функции как потоки, или вилки, или как другое.

Теперь к моему вопросу / проблеме: Я столкнулся с проблемой со статическими библиотеками. Я использовал ffmpeg для тестирования, и он собирает статические библиотеки, такие как libavcodc, libavutil и так далее. К сожалению, «ld -r» не связывает файлы .a. Поэтому я попытался извлечь эти библиотеки с помощью ar -x, а затем связать извлеченные файлы .o указанным выше способом с «большим» новым файлом .o. Но я не работал, потому что libavcodec и libavutil оба включают файл ff_inverse.o. Это, очевидно, не проблема, когда я просто собираю ffmpeg, который свяжет эти статические библиотеки. Но, тем не менее, обе библиотеки включают его, поэтому должен быть механизм, который делает выбор, который ff_inverse.o использовать и связывать. Итак, мой вопрос: как это работает? В чем разница?

1 Ответ

0 голосов
/ 30 августа 2011

Способ, которым ld делает это с обычными ссылками, заключается в определении приоритетов библиотек. Библиотеки, перечисленные первыми в командной строке, связаны первыми, и только если символы все еще не разрешены, он переходит к следующей библиотеке. При связывании статических библиотек он игнорирует имя каждого файла .o, поскольку имя не нужно, нужны только экспортированные символы. Вы можете эмулировать это поведение, извлекая библиотеки в отсортированном порядке.

...