为什么GCC链接器的-wrap选项对我不起作用?

时间:2017-02-09 09:07:02

标签: c++ gcc linker wrapper

我正在尝试使用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错误。

0 个答案:

没有答案