system
への呼び出しをラップして引数に前処理を追加するために、linuxでLD_PRELOAD
を使用しようとしています。ここに私のsystem.cpp
です:LD_PRELOAD'edライブラリからsystem()関数が呼び出されていません
#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());
}
私は.soのオブジェクトを生成
g++ -shared -fPIC -ldl -o libsystem.so system.cpp
でそれを構築します。一見、私のsystem
関数が呼び出されていない - 私はその後、私はすべてのエラーを得ることはありません
$ LD_PRELOAD=/path/to/libsystem.so ./myprogram
で私のプログラムを実行します。 LD_DEBUG=libs
を実行すると、自分の.soがロードされているのがわかりますが、私のsystem
関数は呼び出されておらず、代わりに標準ライブラリの関数が呼び出されています。
コード/ビルドを変更するには何が必要ですか?
はい!それはそれだった。 'string libsystem.so |のように名前のマングリングについて不思議でした。 grep system'は 'system'関数名の周りにいくつかのmanglingを持っていました。 'extern" C "で、正しく動作します! –