5

gcc 2.95.3 を搭載した古いシステムを使用しています。2 つのオブジェクトをリンクする必要があります。これらのオブジェクトは互いに何の関係もありませんが、それぞれが同様の名前のメソッドを持っています。どちらの名前も変更できませんが、リンカーが文句を言わないようにビルドする方法があることを願っています。それが不平を言っているメソッドは、それぞれオブジェクト内のクラスによって内部的に呼び出されます。私に何ができる?

4

1 に答える 1

9

完全な GNU ツールチェーンがある場合は、次のように を使用して問題を回避できるはずですobjcopy(問題を正しく理解していれば)。

これは非常によく似た 2 つのオブジェクト "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
$ 

したがって、オブジェクトの 1 つ (または必要に応じて両方)objcopyの可視性を変更するために使用しclashます。

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

これで、変更されたオブジェクトと正常にリンクできるようになり、プログラムは次のように動作します。

$ gcc -o test main.o foo.o bar2.o
$ ./test
foo: Hello
bar: world
$ 
于 2010-07-14T23:11:19.843 に答える