【发布时间】:2017-01-19 09:01:42
【问题描述】:
我试图在链接过程中将一个符号换成另一个符号。据我了解,使用 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());
}
我如何构建和链接它们:
$ 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(只有它们的对象),但我可以编写任何代码并在链接之前对对象执行任何我需要的操作。
我发现了以下与类似任务相关的问题(并且更好地描述了它) GNU gcc/ld - wrapping a call to symbol with caller and callee defined in the same object file 重读答案,我发现情况相同,符号已经存在,我会发生冲突。
如何在不接触源代码的情况下从 a.o 中删除 foo?
【问题讨论】:
标签: c++ macos gcc shared-libraries ld