Если у вас есть полный набор инструментов GNU, вы сможете обойти свою проблему, используя objcopy
, например так (если я правильно понял вашу проблему):
Вот два очень похожих объекта, "foo" и "bar", оба из которых экспортируют символ с именем clash
- который используется внутри, но на самом деле его вообще не нужно экспортировать:
$ cat foo.c
#include <stdio.h>
void clash(char *s) { printf("foo: %s\n", s); }
void foo(char *s) { clash(s); }
$
и
$ cat bar.c
#include <stdio.h>
void clash(char *s) { printf("bar: %s\n", s); }
void bar(char *s) { clash(s); }
$
А вот основной код, который хочет использовать оба:
$ cat main.c
extern void foo(char *s);
extern void bar(char *s);
int main(void)
{
foo("Hello");
bar("world");
return 0;
}
$
Соединение их вместе не работает:
$ gcc -Wall -c foo.c
$ gcc -Wall -c bar.c
$ gcc -Wall -c main.c
$ gcc -o test main.o foo.o bar.o
bar.o: In function `clash':
bar.c:(.text+0x0): multiple definition of `clash'
foo.o:foo.c:(.text+0x0): first defined here
collect2: ld returned 1 exit status
$
Итак, используйте objcopy
чтобы изменить видимость clash
в одном (или обоих, если хотите!) объектах:
$ objcopy --localize-symbol=clash bar.o bar2.o
$
Теперь вы можете успешно связываться с измененным объектом - и программа ведет себя так, как и должна:
$ gcc -o test main.o foo.o bar2.o
$ ./test
foo: Hello
bar: world
$