Solaris 10/SPARCを使用して簡単なテストを試みましたdladdr()
(ただし、注意: GCC 3.4、ストレート C)。
#include <dlfcn.h>
#include <stdio.h>
void print_name(char *name, void *addr);
void print_name_by_dladdr(void *addr);
int main(int argc, const char *argv[])
{
print_name("main", (void *)&main);
print_name("print_name", (void *)&print_name);
print_name("printf", (void *)&printf);
return 0;
}
void print_name(char *name, void *addr)
{
(void)printf("Getting name of function %s() at 0x%x\n", name, addr);
print_name_by_dladdr(addr);
}
void print_name_by_dladdr(void *addr)
{
Dl_info dli;
if(!dladdr(addr, &dli)) {
perror("dladdr()");
exit(1);
}
(void)printf(" %s\n", dli.dli_sname);
}
出力:
Getting name of function main() at 0x10714
main
Getting name of function print_name() at 0x10778
print_name
Getting name of function printf() at 0x209b8
_PROCEDURE_LINKAGE_TABLE_
これは、私が書いた場合にも正しく機能します(たとえば)
print_name("main", (void *)&main + 4);
の出力に対して正しく解決できると言うnm
ので、可能性は限られているようです...リターンアドレスが導出されているか、リゾルバ関数に正しく渡されていることは確かですか? これにGCCビルトインを使用していると思いますか?私はテスト__builtin_return_address(0)
しましたが、これも私にとってはうまくいきます。GCC ビルトインを使用している場合、電話しましたか__builtin_extract_return_address()
(詳細については上記のページを参照してください。明示的に SPARC について言及しています)。あなたのコードを投稿できますか?
「独自のバイナリ/共有オブジェクトファイルを再読み込みするプロセス」に少し手を伸ばすことはできますか? もしそうなら、libelfは前進する方法かもしれません. これは、あなたが言及したユーティリティの一部が使用しているものですnm
。
sun.com のこの紹介記事は役に立つかもしれません (警告: 記事は 10 年前のものです)。
これは、ネイティブのイントロスペクションを行うほど良くはなく、dladdr(3C)
機能しないのは奇妙です:(
代替の中間:RTLD_DL_SYMENT
フラグを試しましたかdladdr1(3C)
(そしてnm.c
、返された ELF sym で上記のように借用した可能性があります)?