C++ 在OS X上链接期间包装符号

C++ 在OS X上链接期间包装符号,c++,macos,gcc,shared-libraries,ld,C++,Macos,Gcc,Shared Libraries,Ld,在链接过程中,我试图用一个符号包装另一个符号。据我所知,使用ld--wrap选项很容易做到这一点,但在OSX上它不可用。这里有“-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_f

在链接过程中,我试图用一个符号包装另一个符号。据我所知,使用ld--wrap选项很容易做到这一点,但在OSX上它不可用。这里有“-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());
}
甚至有可能实现我想要的吗


编辑: 在我的任务中,我无法控制a.cpp和main.cpp(它们只有对象),但在链接之前,我可以编写任何代码并对对象执行任何需要的操作

我发现下面的quistion与类似的任务相关(并且描述得更好) 重读答案,我看到情况是一样的,符号已经存在,我将有一个冲突


如何在不接触源代码的情况下从a.o中删除foo?

这必须在链接和运行时完成吗?注意完全确定你想做什么,所以只是问问

使用该链接器命令的问题在于它会创建一个新符号,这就是为什么会得到重复符号

-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的.cpp(即省略foo),可以执行以下操作:

tmp$ gcc -Wl,-alias,__Z8wrap_foov,__Z3foov b.o main.o
tmp$ ./a.out
42

你总是可以做的是有一个.cpp有另一个
foo
original\u foo
。这样,如果您想要实现,可以使用alias将其映射到
foo
。虽然不完美,但它可以大致实现你想要的。您已经在link上对其进行了调整,因此这似乎是可以接受的。

您可以尝试使用binutils或crosstool ng(自制)。它们都包含对象副本。objcopy允许您删除符号。顺便说一句,您可能只想更改符号的名称,以防它在.o中的其他位置被引用。我终于解决了crosstool ng中的gobjcopy问题
tmp$ gcc -Wl,-alias,__Z8wrap_foov,__Z3foov b.o main.o
tmp$ ./a.out
42