Как обойти “несколько определенных символов” в соединении с gcc

Я использую более старую систему, которая имеет gcc 2.95.3, я должен связаться в двух объектах, что, хотя они не имеют никакого отношения друг к другу, каждый из них так же назвал методы. Я не могу переименовать ни одного из них, но я надеялся бы, что существует способ создать их относительно не, сделали, чтобы компоновщик жаловался. Методы, на которые это жалуется, каждый внутренне называют классы в объекте. Что я могу сделать?

5
задан CptanPanic 14 July 2010 в 16:25
поделиться

1 ответ

Если у вас есть полный набор инструментов 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 , чтобы изменить видимость of конфликт в одном (или в обоих, если хотите!) объектах:

$ objcopy --localize-symbol=clash bar.o bar2.o
$ 

Теперь вы можете успешно связать с измененным объектом - и программа ведет себя так, как должна:

$ gcc -o test main.o foo.o bar2.o
$ ./test
foo: Hello
bar: world
$ 
9
ответ дан 14 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: