从linux获取导出函数的名称和地址

前端之家收集整理的这篇文章主要介绍了从linux获取导出函数的名称和地址前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我可以使用PIMAGE_DOS_HEADER API(example)从Windows中的可执行文件获取导出的函数名称和指针列表.@H_502_2@

什么是Linux的等效API?@H_502_2@

对于上下文我正在创建单元测试可执行文件,我正在导出以名称“test_”开头的函数,我希望可执行文件只是在运行时旋转并执行所有测试函数.@H_502_2@

示例伪代码:@H_502_2@

@H_502_2@

  1. int main(int argc,char** argv)
  2. {
  3. auto run = new_trun();
  4. auto module = dlopen(NULL);
  5. auto exports = get_exports(module); // <- how do I do this on unix?
  6. for( auto i = 0; i < exports->length; i++)
  7. {
  8. auto export = exports[i];
  9. if(strncmp("test_",export->name,strlen("test_")) == 0)
  10. {
  11. tcase_add(run,export->func);
  12. }
  13. }
  14. return trun_run(run);
  15. }

编辑:@H_502_2@

在使用这个问题的最佳答案后,我能够找到我的样子:
List all the functions/symbols on the fly in C?@H_502_2@

另外,我必须使用Nominal Animal的答案中的gnu_hashtab_symbol_count函数来处理DT_GNU_HASH而不是DT_HASH.@H_502_2@

我的最终测试主要功能如下所示:@H_502_2@

@H_502_2@

  1. int main(int argc,char** argv)
  2. {
  3. vector

然后我在程序集中定义测试,如:@H_502_2@

@H_502_2@

  1. // test.h
  2. #define START_TEST(name) extern "C" EXPORT TResult test_##name () {
  3. #define END_TEST return tresult_success(); }
  4. // foo.cc
  5. START_TEST(foo_bar)
  6. {
  7. assert_pending();
  8. }
  9. END_TEST

这会产生如下所示的输出:@H_502_2@

@H_502_2@

  1. test_foo_bar: pending
  2. 1 pending
  3. 0 succeeded
  4. 1 total
最佳答案
要从Linux下的共享库(.so)获取导出符号的列表,有两种方法:简单方法和稍微更难方法.@H_502_2@

最简单的方法是使用已经可用的控制台工具:objdump(包含在GNU binutils中):@H_502_2@

@H_502_2@

  1. $objdump -T /usr/lib/libid3tag.so.0
  2. 00009c15 g DF .text 0000012e Base id3_tag_findframe
  3. 00003fac g DF .text 00000053 Base id3_ucs4_utf16duplicate
  4. 00008288 g DF .text 000001f2 Base id3_frame_new
  5. 00007b73 g DF .text 000003c5 Base id3_compat_fixup
  6. ...

稍微更难的方法是使用libelf并编写一个C/C++程序来自己列出符号.看看elfutils包,它也是从libelf源构建的.有一个名为eu-readelf的程序(relflf的elfutils版本,不要与binutils readelf混淆). eu-readelf -s $LIB使用libelf列出导出的符号,因此您应该能够将其用作起点.

猜你在找的Linux相关文章