如果你有一个完整的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); }
$
Run Code Online (Sandbox Code Playgroud)
和
$ cat bar.c
#include <stdio.h>
void clash(char *s) { printf("bar: %s\n", s); }
void bar(char *s) { clash(s); }
$
Run Code Online (Sandbox Code Playgroud)
这是主要代码,它想要使用两者:
$ cat main.c
extern void foo(char *s);
extern void bar(char *s);
int main(void)
{
foo("Hello");
bar("world");
return 0;
}
$
Run Code Online (Sandbox Code Playgroud)
将它们链接在一起不起作用:
$ 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
$
Run Code Online (Sandbox Code Playgroud)
因此,用于objcopy更改对象clash中的一个(或两者,如果您喜欢!)的可见性:
$ objcopy --localize-symbol=clash bar.o bar2.o
$
Run Code Online (Sandbox Code Playgroud)
现在,您可以成功链接已修改的对象 - 程序的行为应该如下:
$ gcc -o test main.o foo.o bar2.o
$ ./test
foo: Hello
bar: world
$
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5179 次 |
| 最近记录: |