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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 架构设计&分布式&数据结构与算法面试题(2020最新版)「建议收藏」

    架构设计&分布式&数据结构与算法面试题(2020最新版)「建议收藏」文章目录架构设计请列举出在JDK中几个常用的设计模式?什么是设计模式?你是否在你的代码里面使用过任何设计模式?静态代理、JDK动态代理以及CGLIB动态代理静态代理动态代理cglib代理单例模式工厂模式观察者模式装饰器模式秒杀系统设计分布式分布式概述分布式集群微服务多线程高并发分布式系统设计理念分布式系统的目标与要素分布式系统设计两大思路:中心化和去中心化分布式与集群的区别是什么?CAP定理CAP…

    2022年5月31日
    31
  • Discuz搬家教程[通俗易懂]

    Discuz搬家教程[通俗易懂]第一步:备份网站数据进入后台—站长—数据库—备份,数据备份类型选择“Discuz!和UCenter数据”,备份成功以后,数据自动保存在data文件夹下。第二步:网站文件下载把整个网站文件打包(虚拟主机管理控制面板一般都有整站压缩和解压的功能,在控制面板选择压缩,压缩之后的文件一般在FTPDB文件夹里面,然后把压缩包下载到本地电脑,如果虚拟主机没有在线压缩功能那就直接使用FTP下载文件到本地保存。第三步:整理下载到本地的网站文件1.把下载下来的文件里面的下列文件删除,请完全放心删除掉这几个文件,

    2022年7月25日
    21
  • UDP协议的详细解析「建议收藏」

    UDP协议的详细解析「建议收藏」UDP数据报一、UDP的概述二、UDP的首部格式UDP校验

    2022年6月7日
    35
  • ideal 2022 激活码【2022免费激活】2022.03.01「建议收藏」

    (ideal 2022 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年4月2日
    313
  • bcp sqlcmd bulkinsert在unicode问题,Unexpected EOF encountered in BCP data-file

    bcp sqlcmd bulkinsert在unicode问题,Unexpected EOF encountered in BCP data-file

    2022年1月9日
    61
  • opencv中resize函数怎么用(图像resize)

    opencv中的resize函数有多种用法:1,图像缩放opencv帮助文档中对resize函数的介绍:src输入图dst输出图,形态和输入图相同,当dsize不等于0,输出图尺寸会和dsize相同,当dsize等于0,输出图尺寸会由输入图尺寸、fx、fy计算而得dsize输出尺寸,当输入为0时,fx、fy皆不可为0,dsize=Size(round(fxsrc.cols),round(fysrc.rows))fx水平缩放比例,当输入为0时,fx=(do

    2022年4月17日
    308

发表回复

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

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