Вручную указать переназначение определенных символов ссылок
Без изменения этих двух исходных файлов, есть ли способ взять объектные файлы, созданные путем их компиляции и убедить компоновщика в ссылкеfoo
в main_v1.c доbar
в bar.c?
main_v1.c
void foo(void);
int main(void)
{
foo();
}
bar.c
#include <stdio.h>
void bar(void)
{
puts("bar()!");
}
Изменение самих объектных файлов является честной игрой, но предположим, что у нас может даже не быть доступного исходного кода. Платформа Linux.
Настаивая на скромном изменении main_v1.c и добавляя ссылки на дополнительный объектный файл «mapping», вот способ почти получить желаемый результат с помощью стандартного C.
main_v2.c
extern void (*const foo)(void);
int main(void)
{
foo();
}
bar.c без изменений.
map.c
void bar(void);
void (*const foo)(void) = bar;
Если объектные файлы скомпилированы с помощью lto, разыменование указателя на функцию даже исключается (с использованием недавнего gcc). Это довольно хороший результат, но еслиmain()
изменен, чтобы иметь прямой вызовbar()
, затемbar()
сам по себе встроен после ссылки, так что есть возможности для улучшения.