Dlsym_c=α+βy

Dlsym_c=α+βy为什么80%的码农都做不了架构师?>>>…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

先从百度百科把dlsym的简介拉过来:

功能:根据动态链接库操作句柄与符号,返回符号对应的地址;

函数定义:void*dlsym(void*handle,constchar*symbol);

函数描述:dlsym(dynamic library symbol) 根据 动态链接库 操作句柄(handle)与符号(symbol),返回符号对应的地址。使用这个函数不但可以获取函数地址,也可以获取变量地址。 handle:由dlopen打开动态链接库后返回的指针; symbol:要求获取的函数或全局变量的名称。 返回值: void* 指向函数的地址,供调用使用。

现在来看三个示例,main.c、test_C.c、test_C++.cpp:

/************** main.c gcc main.c -ldl -o main **************/ #include <stdio.h> #include <dlfcn.h> void main() { void *handle; void(*test)(); handle = dlopen("/home/auo/Study/C/name mangling/libtest_C.so", RTLD_NOW); if(!handle) return -1; test = (void(*)())dlsym(handle, "test"); printf("test in C addr:\t%x\n", test); test(); handle = dlopen("/home/auo/Study/C/name mangling/libtest_C++.so", RTLD_NOW); if(!handle) return -1; test = (void(*)())dlsym(handle, "test"); printf("test in C++ addr:\t%x\n", test); test(); }

Jetbrains全家桶1年46,售后保障稳定

/************** test_C.c gcc test_C.c -fPIC -shared -o libtest_C.so **************/ #include <stdio.h> void test() { printf("Call test in C\n"); }

/************** test_C++.cpp g++ test_C++.cpp -fPIC -shared -o libtest_C++.so **************/ #include <stdio.h> void test() { printf("Call test in C++\n"); }

编译完成后得到可执行程序main,动态库文件libtest_C.so、libtest_C++.sp。在终端执行main函数结果如下:

092746_p7bt_1391727.png

dlsym函数并没有成功找到由g++编译后的libtest_C++.so里的函数test的地址,我们知道dlsym函数是通过查找指定动态库中的符号表来获得符号地址的,我们现在用readelf查看下libtest_C++.so的符号表:

093127_27KH_1391727.png

清楚的看到并没有符号test的信息,而只有_Z4testv的符号信息,所以当dlsym查找符号test的时候自然就返回0了。我们再看一下libtest_C.so的符号表:

093443_xVra_1391727.png

可以看到libtest_C.so符号表是存在test符号的。

那么,为什么g++编译器会将符号test更名为_Z4testv呢,这个就是因为name mangling机制。具体来讲就是因为C++存在函数重载,C++编译器在编译的时候会根据一个函数的名字、参数、返回值来生产一个独一无二的符号名字,这样才Link的时候,才能区分出不同的函数。extern “C” void test()可以避免name mangling(事实上,就是告诉编译器这个函数按照C的规则进行编译,自然就不会发生name mangling)。

转载于:https://my.oschina.net/auo/blog/315871

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215890.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 测试用例八大要素以及设计方法

    测试用例八大要素以及设计方法测试用例(TestCase)是指对一项特定的软件产品进行测试任务的描述,体现测试方案、方法、技术和策略。其内容包括测试目标、测试环境、输入数据、测试步骤、预期结果、测试脚本等,最终形成文档。简单地认为,测试用例是为某个特殊目标而编制的一组测试输入、执行条件以及预期结果,用于核实是否满足某个特定软件需求测试用例八大要素1.测试用例编号由字母、字符、数字组合而成的字符串,有唯一性,易识别性。eg:1)系统测试:产品编号-ST-系统测试项名-系统测试子项名-编号2)集成测试:产品编号

    2022年6月28日
  • 联合索引在B+Tree上的存储结构及数据查找方式[通俗易懂]

    联合索引在B+Tree上的存储结构及数据查找方式[通俗易懂]最困难的事情就是认识自己!个人网站,欢迎访问!前言:本篇文章主要是阐述下联合索引在B+Tree上的实际存储结构。本文主要讲解的内容有:联合索引在B+树上的存储结构联合索引的查找方式为什么会有最左前缀匹配原则在分享这篇文章之前,我在网上查了关于MySQL联合索引在B+树上的存储结构这个问题,翻阅了很多博客和技术文章,其中有几篇讲述的与事实相悖。具体如下:很多博客中都是说:联合索引在B+树上的非叶子节点中只会存储联合索引中的第一个索引字段的.

    2022年6月4日
  • 按位取反运算符_按位取反运算符的运算举例

    按位取反运算符_按位取反运算符的运算举例一、定义取反操作符是位运算符的中一个,作用是按位补运算符翻转操作数的每一位。二、举例说明正数:~(6)6的二进制表示00000110按位取反11111001说明:在计算机中,正数用

    2022年8月1日
  • jquery 判断变量是否为空

    jquery 判断变量是否为空

    2021年7月20日
  • 第一高分大省——河北,新高考正式执行,权威政策解读来了!其他省很可能参照河北模式!

    第一高分大省——河北,新高考正式执行,权威政策解读来了!其他省很可能参照河北模式!第一高分大省——河北,新高考正式执行,权威政策解读来了!其他省很可能参照河北模式!1、语数外和6选3组合方案提出,2021年开始,考生总成绩由统一高考的语文、数学、外语3个科目成绩和高中学业水平考试3个科目成绩组成。 2、语数外分值不变 统一高考的语文、数学、外语科目分值不变。 3、不分文理科 4、外语可以考两次 外语科目提供两次考试机会。 …

    2022年7月16日
  • Java–反射机制原理、几种Class获取方式及应用场景[通俗易懂]

    Java–反射机制原理、几种Class获取方式及应用场景[通俗易懂]目录学习背景一、Java反射机制是什么?1.1反射原理1.2举例说明二、Java反射机制中获取Class的三种方式及区别?2.1三种方式及区别2.2代码演示区别三、Java反射机制的应用场景有哪些?3.1应用场景3.2应用场景实现3.2.1简单工厂模式3.2.2简单工厂模式优化(应用场景)3.2.1代理模式中动态代理(应用场景)学习背景学习Java的小伙伴,可能听过Java反射机制,但是熟悉又有点陌生,本文主要是通过思考面试中经常被问到的几个Java反射机制的问题,再通过理论知识结合代

    2022年8月24日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号