在 OS X 上链接期间换行符号
Wrapping symbols during linking on OS X
我试图在 link 期间将一个符号换成另一个符号。据我所知,这很容易用 ld --wrap 选项完成,但在 OS X 上它不可用。有'-idefinition:indirection',在这里我试图欺骗 main 所以它会打印 42:
a.cpp:
int foo() {
return 1;
}
b.cpp:
int wrap_foo() {
return 42;
}
main.cpp:
#include <cstdio>
int foo();
int wrap_foo();
int main() {
printf("%d\n", foo());
}
我和 link 他们是如何建造的:
$ gcc -c *.cpp
$ gcc -Wl,-i__Z3foov:__Z8wrap_foov *.o
duplicate symbol __Z3foov in:
a.o
b.o
ld: 1 duplicate symbol for architecture x86_64
有没有可能实现我想要的?
编辑:
在我的任务中,我无法控制 a.cpp 和 main.cpp(只有它们的对象),但我可以编写任何代码并对 link 之前的对象执行任何我需要的操作。
我发现了以下与类似任务相关的问题(并更好地描述了它)
GNU gcc/ld - wrapping a call to symbol with caller and callee defined in the same object file
重读答案我发现情况相同,符号已经存在,我将发生碰撞。
如何在不触及源代码的情况下从 a.o 中删除 foo?
这是否必须在 link 与运行时完成?请注意完全确定您要做什么,所以只问一下。
使用那个 linker 命令的问题是它创建了一个新的符号,这就是为什么你得到重复的符号。
-alias symbol_name alternate_symbol_name
Create an alias named alternate_symbol_name for the symbol
symbol_name. By default the alias symbol has global visibil-
ity. This option was previous the -idef:indir option.
如果您没有定义 foo 的 a.cpp(即您省略了 foo),您可以这样做:
tmp$ gcc -Wl,-alias,__Z8wrap_foov,__Z3foov b.o main.o
tmp$ ./a.out
42
你总是可以做的是让 a.cpp 有另一个 foo
像 original_foo
。这样,如果您想要该实现,您可以使用别名将其映射到 foo
。不完美,但它会大致达到你想要的。您已经在 link 完成调整它的工作,因此它似乎可以接受。
我试图在 link 期间将一个符号换成另一个符号。据我所知,这很容易用 ld --wrap 选项完成,但在 OS X 上它不可用。有'-idefinition:indirection',在这里我试图欺骗 main 所以它会打印 42:
a.cpp:
int foo() {
return 1;
}
b.cpp:
int wrap_foo() {
return 42;
}
main.cpp:
#include <cstdio>
int foo();
int wrap_foo();
int main() {
printf("%d\n", foo());
}
我和 link 他们是如何建造的:
$ gcc -c *.cpp
$ gcc -Wl,-i__Z3foov:__Z8wrap_foov *.o
duplicate symbol __Z3foov in:
a.o
b.o
ld: 1 duplicate symbol for architecture x86_64
有没有可能实现我想要的?
编辑: 在我的任务中,我无法控制 a.cpp 和 main.cpp(只有它们的对象),但我可以编写任何代码并对 link 之前的对象执行任何我需要的操作。
我发现了以下与类似任务相关的问题(并更好地描述了它) GNU gcc/ld - wrapping a call to symbol with caller and callee defined in the same object file 重读答案我发现情况相同,符号已经存在,我将发生碰撞。
如何在不触及源代码的情况下从 a.o 中删除 foo?
这是否必须在 link 与运行时完成?请注意完全确定您要做什么,所以只问一下。
使用那个 linker 命令的问题是它创建了一个新的符号,这就是为什么你得到重复的符号。
-alias symbol_name alternate_symbol_name
Create an alias named alternate_symbol_name for the symbol
symbol_name. By default the alias symbol has global visibil-
ity. This option was previous the -idef:indir option.
如果您没有定义 foo 的 a.cpp(即您省略了 foo),您可以这样做:
tmp$ gcc -Wl,-alias,__Z8wrap_foov,__Z3foov b.o main.o
tmp$ ./a.out
42
你总是可以做的是让 a.cpp 有另一个 foo
像 original_foo
。这样,如果您想要该实现,您可以使用别名将其映射到 foo
。不完美,但它会大致达到你想要的。您已经在 link 完成调整它的工作,因此它似乎可以接受。