16

例えば:

void* sdl_library = dlopen("libSDL.so", RTLD_LAZY);
void* initializer = dlsym(sdl_library,"SDL_Init");

エラーがないと仮定すると、初期化子は共有ライブラリlibSDK.soの関数SD_Initを指します。

ただし、これには、シンボル「SDL_Init」が存在することを知っている必要があります。

ライブラリにそのすべてのシンボルを照会することは可能ですか?たとえば、この場合、SDL_Init、関数ポインター、およびlibSDL.soによってエクスポートされたその他のシンボルが返されます。

4

5 に答える 5

16

これを行うためのlibc関数はありません。ただし、自分で作成することはできます(ただし、コードは多少複雑です)。

Linuxでは、実際には、ロードされた共有オブジェクトのベースアドレスを指す名前のメンバーを持つ構造体dlopen()のアドレスを返します(システムが共有ライブラリの配置をランダム化せず、ライブラリが事前にリンクされていないことを前提としています)。link_mapl_addr

Linuxでは、ベースアドレス(のアドレス)を見つける確実な方法は、ライブラリを作成した後Elf*_Ehdrに使用することです。dl_iterate_phdr()dlopen()

ELFヘッダーがあると、エクスポートされたシンボルのリスト(動的シンボルテーブル)を反復処理できるはずです。最初Elf*_Phdrにタイプのを見つけ、PT_DYNAMIC次にエントリを見つけて、動的シンボルテーブル内のすべてのシンボルを反復処理します。あなたを導くために使用してください。DT_SYMTABDT_STRTAB/usr/include/elf.h

また、libelfを使用することもできますが、これまでの経験がないため、ご案内できません。

最後に、この演習はやや無駄であることに注意してください。定義された関数のリストを取得しますが、それらを呼び出す方法(それらが期待するパラメーター)がわからないので、ポイントは何ですか?

于 2010-04-22T20:50:58.487 に答える
1

このための公開されたAPIはないと思います。binutilsのnmツールを使用するか、そのソースコードを調べることができます: http ://sourceware.org/cgi-bin/cvsweb.cgi/src/binutils/?cvsroot = src

http://sourceware.org/cgi-bin/cvsweb.cgi/src/binutils/nm.c?rev=1.63&content-type=text/x-cvsweb-markup&cvsroot=src

(明らかにエルフを想定)

于 2010-04-22T20:50:31.983 に答える
0

Boost.DLLは、関数を通じてこの機能を提供しますlibrary_info::symbolsシンボルのライブラリのクエリに関するチュートリアルから適応:

// Class `library_info` can extract information from a library
boost::dll::library_info inf(libpath);

// Getting exported symbols
std::vector<std::string> exports = inf.symbols();

// Printing symbols
for (std::size_t j = 0; j < exports.size(); ++j) {
    std::cout << exports[j] << std::endl;
}

これは、フラグなしnmでリストされているシンボル、つまりセクション内のシンボルに対してのみ機能することに注意してください。一部のライブラリは、そのセクションのシンボルをエクスポートしないようです。その場合のセクションへのフォールバックをサポートする機能リクエストを開きました。--dynamic.symtab.dynsym

于 2020-06-29T17:00:07.900 に答える
-3
void *dlsym(void *restrict handle, const char *restrict name);

戻り値

handleがdlopen()によって開かれた有効なオブジェクトを参照していない場合、または指定されたシンボルがhandleに関連付けられたオブジェクト内に見つからない場合 、dlsym()はNULLを返します。より詳細な診断情報は、dlerror()を介して入手できます。

(出典:http ://www.opengroup.org/onlinepubs/009695399/functions/dlsym.html )

つまり、シンボルが見つからない場合は、dlsym()を返しNULLます。それがあなたが探しているものであるかどうかはわかりませんが、それは私が見つけることができる最も簡単な方法です。

于 2010-04-22T20:43:53.383 に答える
-3

linux nmコマンドを使用できます:http://man.yolinux.com/cgi-bin/man2html? cgi_command = nm

于 2015-02-24T18:02:36.760 に答える