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)
上一篇 2025年7月12日 下午6:43
下一篇 2025年7月12日 下午7:15


相关推荐

  • JSP+MySQL校园新闻网站实战教程与源代码

    JSP+MySQL校园新闻网站实战教程与源代码熊猫大哥大教程 JSP MySQL 校园新闻网站 1 需求分析 熊猫大哥大教程 JSP MySQL 校园新闻网站 2 开发环境搭建 熊猫大哥大教程 JSP MySQL 校园新闻网站 3 数据库与 java 项目创建 熊猫大哥大教程 JSP MySQL 校园新闻网站 4 新闻浏览功能开发 熊猫大哥大教程 JSP MySQL 校园新闻网站 5 新闻查看功能开发 熊猫大哥大教程 JSP MySQL 校园新闻网站 6 管理员登录功能开发 熊猫大哥大教程 JSP My

    2026年3月26日
    2
  • Execution failed for task ‘:sdkdemo:mergeDebugResources‘.

    Execution failed for task ‘:sdkdemo:mergeDebugResources‘.

    2021年10月2日
    45
  • load average 计算「建议收藏」

    load average 计算「建议收藏」平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均活跃进程数。对于Ubuntu获取cpu数和cpu核数more/proc/cpuinfo|grep”physicalid”|uniq|wc-l#=>1more/proc/cpuinfo|grep”physicalid”|grep”0″|wc-l#=>16则1*…

    2022年7月17日
    20
  • 计算机类单位换算,计算机单位换算大全「建议收藏」

    计算机类单位换算,计算机单位换算大全「建议收藏」电脑世界是由0与1组成,其中有数以万计的线路,一条线路传递一个信号,而0代表没有信号,1代表有信号,就像电源开关一样,同一时间只可能有一种状态,所以电脑最基本的单位就是一条线路的信号,我们就把它称作“位”,英文叫做bit,缩写为b。“位”和“字节”其实都是电脑的计量单位,我们可以理解成字节是由位组成的,一个“字节”等于8“位”,Byte是它的缩写.位(bit)这个单位太小,所以字节(Byte)是…

    2022年7月27日
    6
  • response中如何设置contentType

    response中如何设置contentTypeajax开发中,常遇到下面的几种情况:1服务端需要返回一段普通文本给客户端2服务端需要返回一段HTML代码给客户端3服务端需要返回一段XML代码给客户端4服务端需要返回一段javascript代码给客户端5服务端需要返回一段json串给客户端================================对于每一种返回类型规范的做法是要在服务端…

    2022年7月19日
    136
  • Ubuntu 查看磁盘空间大小命令

    Ubuntu 查看磁盘空间大小命令http blog sina com cn s blog 6432901c0100 html nbsp nbsp Df 命令是 linux 系统以磁盘分区为单位查看文件系统 可以加上参数查看磁盘剩余空间信息 命令格式 df hl 显示格式为 文件系统 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 容量已用可用已用 挂载点 Filesystem nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp SizeUsedAva

    2026年3月17日
    2

发表回复

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

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