我試圖在Linux上使用LD_PRELOAD
來包裝調用system
函數來添加一些預處理的參數。這裏是我的system.cpp
:系統()函數不從LD_PRELOAD'ed庫調用
#define _GNU_SOURCE
#include <dlfcn.h>
#include <string>
#include <iostream>
typedef int (*orig_system_type)(const char *command);
int system(const char *command)
{
std::string new_cmd = std::string("set -f;") + command;
// next line is for debuggin only
std::cout << new_cmd << std::endl;
orig_system_type orig_system;
orig_system = (orig_system_type)dlsym(RTLD_NEXT,"system");
return orig_system(new_cmd.c_str());
}
我
g++ -shared -fPIC -ldl -o libsystem.so system.cpp
產生的。所以對象建立它。然後,我
$ LD_PRELOAD=/path/to/libsystem.so ./myprogram
運行我的程序我沒有得到任何錯誤 - 但似乎我的system
功能不被調用。使用LD_DEBUG=libs
運行,我可以看到我的.so正在加載,但是我的system
函數未被調用,而是從標準庫調用函數。
我需要更改代碼/構建才能使其運行?
是的!就是這樣。我確實想知道名稱改寫,因爲'strings libsystem.so | grep系統'有一些圍繞'system'函數名稱的問題。使用'extern「C」'它現在可以正常工作! –