我正在尝试使用GCC链接器选项-wrap包装库函数。 据我所读,这应该用__wrap_libfoo替换符号libfoo,并通过__real_libfoo授予对原始定义的访问权。
我已经实现了这样:
original.h
#ifndef ORIGINAL_H
#define ORIGINAL_H
void libfoo();
#endif //ORIGINAL_H
original.cpp
#include "original.h"
#include <iostream>
void libfoo()
{
std::cout<<"Original libfoo called from original.cpp"<<std::endl;
return;
};
并编译为带有g++ --std=c++11 -c original.cpp -o liboriginal.o
的静态库,打包了ar rcs liboriginal.a liboriginal.o
并移动到链接器已知的位置。
wrapper.h
#ifndef WRAPPER_H
#define WRAPPER_H
// should not need anything here
#endif //WRAPPER_H
wrapper.cpp
#include "wrapper.h"
#include <iostream>
//forward declaration to suppress compiler error
void __real_libfoo();
void __wrap_libfoo()
{
std::cout<<"Wrapper libfoo called from wrapper.cpp"<<std::endl;
__real_libfoo();
return;
};
再次编译为g++ --std=c++11 -c wrapper.cpp -o libwrapper.o
的静态库,打包了ar rcs libwrapper.a libwrapper.o
。
的main.cpp
#include "original.h"
int main()
{
libfoo();
return 0;
}
使用g++ --std=c++11 -c main.cpp -o main.o
进行编译,并将所有内容与g++ -L. -Wl,-wrap=libfoo -o test ./main.o -loriginal -lwrapper
执行时,我只能得到 从original.cpp调用的原始libfoo 在控制台。
为什么链接器不替换符号,因此呼叫被重定向到__wrap_libfoo()
?
而且,如果这个问题得到解决,我该如何处理多个重载函数,哪些都应该被包装?我是否只需要一个-wrap=function_name
或者我是否需要以某种方式为链接器选项添加更详细的签名?
更新:我也尝试过不将包装器链接为lib,而是将其作为目标文件链接。这给了我一个关于缺少的__real_libfoo()实现的链接器的未定义的ref错误。