大佬教程收集整理的这篇文章主要介绍了从linux获取导出函数的名称和地址,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我可以使用PIMAGE_DOS_HEADER API(examplE)从Windows中的可执行文件中获取导出的函数名称和指针列表.
什么是Linux的等效API?
对于上下文我正在创建单元测试可执行文件,我正在导出以名称“test_”开头的函数,我希望可执行文件只是在运行时旋转并执行所有测试函数.
示例伪代码:
int main(int argc,char** argv)
{
auto run = new_trun();
auto module = dlopen(@R_801_6633@
auto exports = get_exports(modulE); // <- how="" do="" i="" do="" this="" on="" unix?="" for(="" auto="" i="0;" i="">->< exports->length;="" i++)="" {="" auto="" export="exports[i];" if(strncmp("test_",export->name,strlen("test_"))="=" 0)="" {="" tcase_add(run,export->func);="" }="" }="" return="" trun_run(run);="" }="">
编辑:
在使用这个问题的最佳答案后,我能够找到我的样子:
List all the functions/symbols on the fly in C?
另外,我必须使用Nominal Animal的答案中的gnu_hashtab_symbol_count函数来处理DT_GNU_HASH而不是DT_HASH.
我的最终测试主要功能如下所示:
int main(int argc,char** argv)
{
vector str());
TCase tcase;
tcase.name = String(Name);
tcase.func = func;
run.test_cases.push_BACk(tcasE);
}
return trun_run(&run);
}
然后我在程序集中定义测试,如:
// test.h
#define START_TEST(Name) extern "C" EXPORT TResult test_##name () {
#define END_TEST return tresult_success(); }
// foo.cc
START_TEST(foo_bar)
{
assert_pending();
}
END_TEST
这会产生如下所示的输出:
test_foo_bar: pending
1 pending
0 succeeded
1 @R_155_10586@l
最简单的方法是使用已经可用的控制台工具:objdump(包含在GNU binutils中):
$objdump -T /usr/lib/libid3tag.so.0
00009c15 g DF .text 0000012e Base id3_tag_findframe
00003fac g DF .text 00000053 Base id3_ucs4_utf16duplicate
00008288 g DF .text 000001f2 Base id3_frame_new
00007b73 g DF .text 000003c5 Base id3_compat_fixup
...
稍微更难的方法是使用libelf并编写一个C/C++程序来自己列出符号.看看elfutils包,它也是从libelf源构建的.有一个名为eu-readelf的程序(relflf的elfutils版本,不要与binutils readelf混淆). eu-readelf -s $LIB使用libelf列出导出的符号,因此您应该能够将其用作起点.
以上是大佬教程为你收集整理的从linux获取导出函数的名称和地址全部内容,希望文章能够帮你解决从linux获取导出函数的名称和地址所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。