Вручную указать переназначение определенных символов ссылок

Без изменения этих двух исходных файлов, есть ли способ взять объектные файлы, созданные путем их компиляции и убедить компоновщика в ссылке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() сам по себе встроен после ссылки, так что есть возможности для улучшения.

Ответы на вопрос(1)

Ваш ответ на вопрос