Перезаписать символ в C/С++

Возможно ли в C/C++ (или, с любым компилятором) переписать символ специально? Например, есть библиотека a.lib которая содержит помимо других функций реализацию foo(). Теперь, в моей программе, я хочу заменить реализацию foo() на другую функцию, так что любой вызов foo() переходит прямо к моей реализации, а не к реализации в a.lib.

Макросы не являются опцией.

Возможно ли это без модификации источника a.lib?

1 ответ

Да, возможно.

Когда вы выполняете статическую ссылку, компоновщик загружает символы из библиотеки тогда и только тогда, когда они необходимы. Если программа или более ранняя библиотека предоставляет этот символ, то она не будет в "нужном" списке.

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

Для динамических библиотек в системах Linux (и других Unix) все не так ясно. Вы можете определить функцию, и ее могут использовать ваши собственные вызывающие абоненты, но вызывающие абоненты в библиотеке могут по-прежнему использовать библиотечную копию. Все это немного запутанно. В Windows файлы .lib вероятно, работают аналогично файлам Linux .a, но .dll файлы - совсем другие звери, с разными путями запутывания.

licensed under cc by-sa 3.0 with attribution.