Порядок компоновки C / C ++ для нескольких определенных символов - PullRequest
3 голосов
/ 15 декабря 2011

Если у меня есть один и тот же символ, определенный в объектном файле и в библиотеке, компоновщик GNU берет символ из объектного файла. Рассмотрим этот пример:

g++ -L"dir/to/lib" -o Executable Test.o foo.o -lMyLib

Если я определил функцию foo с одинаковой сигнатурой как в foo.cpp, так и в исходном файле, из которого была скомпилирована «MyLib», то компоновщик GNU всегда предпочитает ту из первой, если я использую этот порядок. 1005 *

Это поведение GNU toolchain специфично? Знаете ли вы из других линкеров, которые ведут себя так же? Это где-нибудь задокументировано (документация GNU, стандарт C ++)? Я ничего не мог найти ...

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

Ответы [ 3 ]

8 голосов
/ 15 декабря 2011

С http://gcc.gnu.org/onlinedocs/gcc/Link-Options.html:

"компоновщик ищет и обрабатывает библиотеки и объектные файлы в указанном порядке"

3 голосов
/ 15 декабря 2011

Может быть.

Как именно компоновщик обрабатывает предоставленные ему файлы, зависит от компоновщик, но в конкретном случае, который вы описали, я не думаю, что будет быть любой вариацией. Когда вы указываете объектный файл, он включается в вашу окончательную сборку, и вы получите все символы, которые она определяет; если два объектных файла определяют один и тот же символ, вы обычно получите ошибка компоновщика (но есть исключения из-за слабых символов или Fortran-подобная обработка определений данных). Библиотека - это коллекция объектных файлов; стандартная обработка библиотеки для компоновщика сканировать его и включать любые объекты (и только те объекты), которые определить иначе неопределенный внешний. Если объектный файл в библиотека определяет только рассматриваемый символ, и ее определение имеет уже разрешен явно указанным объектным файлом, компоновщиком не будет включать объектный файл из библиотеки в программу. Если объектный файл в библиотеке также определяет другие символы, однако, и один из них разрешает иначе неопределенный внешний объект файл из библиотеки будет включен в вашу программу вместе с все символы, которые он определяет. Что может привести к множественному определения.

0 голосов
/ 15 декабря 2011

С точки зрения языка, «порядок связывания» не определен и не может использоваться надежным способом.

С точки зрения платформы (связки инструментов) его нужно как-то указывать и, как правило, учитыватьбиблиотеки для всех символов, не разрешенных в объектах, и объекты для всех символов, не разрешенных локально.Это позволяет разработчику маскировать / заменять библиотечные функции.

В данный момент gcc (как msvc) связывается в том же порядке, что и командная строка, запускающая компоновщик.Можно ли доверять такому поведению (в том смысле, в каком оно будет поддерживаться в будущих выпусках), неясно.(Документация GCC написана с использованием существующих глаголов ...)

...