首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何在C中获取共享库的名称,符号是在运行时以编程方式从其中加载的?

在C语言中,可以使用dladdr函数来获取共享库的名称和符号。dladdr函数是动态链接器的一部分,它可以查询共享库中的符号信息。

下面是一个示例代码,展示了如何使用dladdr函数获取共享库的名称和符号:

代码语言:txt
复制
#include <stdio.h>
#include <dlfcn.h>

int main() {
    void* handle = dlopen("libexample.so", RTLD_LAZY);
    if (handle == NULL) {
        fprintf(stderr, "Failed to open shared library: %s\n", dlerror());
        return 1;
    }

    void* symbol = dlsym(handle, "example_function");
    if (symbol == NULL) {
        fprintf(stderr, "Failed to find symbol: %s\n", dlerror());
        dlclose(handle);
        return 1;
    }

    Dl_info info;
    if (dladdr(symbol, &info) == 0) {
        fprintf(stderr, "Failed to get symbol info\n");
        dlclose(handle);
        return 1;
    }

    printf("Shared library name: %s\n", info.dli_fname);
    printf("Symbol name: %s\n", info.dli_sname);

    dlclose(handle);
    return 0;
}

在上述代码中,首先使用dlopen函数打开共享库,然后使用dlsym函数获取共享库中的符号。接下来,使用dladdr函数将符号转换为共享库的名称和符号名称。最后,使用dlclose函数关闭共享库。

请注意,上述示例代码仅适用于Linux系统。在其他操作系统上,可能需要使用不同的函数或库来实现相同的功能。

推荐的腾讯云相关产品:腾讯云函数(云原生应用托管服务),详情请参考:https://cloud.tencent.com/product/scf

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

error adding symbols: DSO missing from command line

它发生主要原因未在链接命令中指定所需共享对象。编译器试图将缺失作为符号添加到你程序,但由于找不到该,编译过程失败并显示上述错误消息。...解决方案 以下几种可能解决方案,你可以根据具体情况选择其中一种或多种方法。 1. 添加共享对象路径 错误消息中提到共享对象(DSO)可能位于系统非标准路径。...DSO一种在运行时加载和链接可执行代码形式,它可以被多个程序共享使用,提供了代码重用和模块化开发好处。...动态链接: DSO在操作系统中广泛用于提供常用功能和系统调用接口。操作系统常用libc)通常以DSO形式提供,程序可以通过动态链接方式使用这些。...总结而言,DSO一种在运行时动态加载和链接共享,它提供了代码重用、模块化开发以及动态更新优点,广泛应用于插件系统、动态链接和设备驱动程序等场景。

2.7K10

编译器、链接器和解释器

每个文件都要确认两个事,自己有哪些符号可以供别的文件使用 和 引用别的文件符号真实存在。 链接器会目标文件和文件中提取这些符号,并建立符号表,记录每个符号名称和地址。...如果有多个目标文件或存在相同名称符号,链接器会根据不同规则解决冲突。...这些代码和数据存储在系统共享(也称为动态链接共享对象, .so 或 .dll 文件)。多个程序可以共享同一个实例,减少了存储空间和系统资源浪费。...运行时动态链接:共享已经在加载加载到了内存,但链接最终步骤在程序运行时进行。这时,操作系统会确保程序可以正确地访问所需共享函数和变量。...程序在运行期间,可以根据需要调用共享函数,操作系统会负责将这些调用关联到实际代码。 4.

31820
  • 使用 PerfCollect 跟踪 .NET 应用程序

    然后使用这些数据分析各种运行时组件( GC、JIT 和线程池)行为。 最新版本 .NET Core 和 Linux 性能工具支持自动解析框架代码方法名称。...若要解析本机运行时 DLL 方法名称(例如 libcoreclr.so),perfcollect 将在转换数据时为其解析符号,但前提存在这些二进制文件符号。...替代项:禁用预编译代码 如果无法更新 .NET 运行时添加 crossgen),或者如果上述过程出于某种原因而无效,可以使用另一种方法来获取框架符号。 你可以指示运行时不要使用预编译框架代码。...获取本机运行时符号 大多数情况下,你感兴趣自己代码,perfcollect 默认解析这些代码。...此后,当你运行 perfcollect 时,应获取本机 dll 符号名称

    1.1K20

    LD_LIBRARY_PATH和LIBRARY_PATH区别

    (Shared)目标文件:一类特殊可重定位目标文件,可以在链接(静态共享)时加入目标文件或加载时或运行时(动态共享)被动态加载到内存并执行; 可执行(Executable)文件:由链接器生成,可以直接通过加载加载到内存充当进程执行文件...动态(dynamic library)一种特殊目标模块,它可以在运行时加载到任意内存地址,或者与任意程序进行链接。...这样该程序在被执行时这些代码将被装入到该进程虚拟地址空间中。静态链接实际上一个目标文件集合,其中每个文件含有一个或者一组相关函数代码。...动态链接(加载、运行时) 在此种方式下,函数定义在动态链接共享对象目标文件。在编译链接阶段,动态链接只提供符号表和其他少量信息用于保证所有符号引用都有定义,保证编译顺利通过。...动态链接器(ld-linux.so)链接程序在运行过程根据记录共享对象符号定义来动态加载共享,然后完成重定位。在此可执行文件被执行时,动态链接全部内容将被映射到运行时相应进程虚地址空间。

    1.2K40

    程序员角度看ELF

    链接器然后通过指向程序符号表和链接器自己符号若干指针来初始化一个符号   表链。概念上讲,程序文件和所有加载到进程共享一个符号表。...但实际链接器   并不是在运行时创建一个合并后符号表,而是将个个文件符号表组成一个符号表链。   ...如果要查找   名称存在于其中,则采用文件相应路径。...dynamic段,它将符号表加入到符号表链   ,如果该还进一步需要其它尚未加载,则将那些新置入将要加载链表。   ...然后它将SONAM   E和全路径名称写入缓冲文件,这样在运行时动态链接器可以很快找到每一个的当前版   本。

    98740

    c#封装动态_nginx调用so动态

    1、一个程序源文件编译生成可执行文件步骤: 预编译 –> 编译 –> 汇编 –> 链接 (1)预编译,即预处理,主要处理在源代码文件“#”开始预编译指令,宏展开、处理条件编译指令、处理#...链接过程主要工作符号解析和重定位。 2、 一组目标文件包,就是一些最常用代码编译成目标文件后打包存放。而最常见就是运行时(Runtime Library),C运行库CRT....在编译链接可执行文件时,只需要链接引入库,DLL函数代码和数据并不复制到可执行文件在运时候,再去加载DLL,访问DLL中导出函数。...3)在运行时可以动态地选择加载各种应用程序模块 下面重点介绍Windows下动态链接DLL. DLL即动态链接(Dynamic-Link Libaray)缩写,相当于Linux下共享对象。...对于其他DLL导入符号,需要使用“__declspec(dllimport)”显式声明某个符号为导入符号。在ELF,使用外部符号时,不需要额外声明该符号其他共享对象导入

    2.7K20

    【解惑】Java 代码执行原理

    需要注意,类即使不在源文件定义,但被源文件引用,编译后,也会编程相应字节码文件。...类A引用类C,但类C不定义在类A源文件,编译后,类C也被编译成对应字节码文件C.class Tips:关注微信公众号:Java后端,每日获取技术博文推送。...启动类加载Java虚拟机唯一实现一部分,它又可分为原始类装载器,系统类装载器或默认类装载器。它主要作用是操作系统磁盘装载相应类,Java API类等。...有些运行时数据区由线程共享,有些只能由某个特定线程共享。 运行时数据区大致可分几个区:方法区,堆区,栈区,PC寄存器区和本地方法栈区。 在该阶段,涉及到如下基本概念和知识。...2)堆 堆用来存储相关引用类型new对象。当程序运行时,虚拟机会把所有该程序在运行时创建对象都放到堆。 3)PC寄存器 PC寄存器主要用来存储线程。

    1.3K20

    你写 Java 代码如何一步步输出结果

    需要注意,类即使不在源文件定义,但被源文件引用,编译后,也会编程相应字节码文件。...类A引用类C,但类C不定义在类A源文件,编译后,类C也被编译成对应字节码文件C.class 三 执行java源文件 执行java源文件,用java.exe执行即可 ?...启动类加载Java虚拟机唯一实现一部分,它又可分为原始类装载器,系统类装载器或默认类装载器。它主要作用是操作系统磁盘装载相应类,Java API类等。...有些运行时数据区由线程共享,有些只能由某个特定线程共享。 运行时数据区大致可分几个区:方法区,堆区,栈区,PC寄存器区和本地方法栈区。 在该阶段,涉及到如下基本概念和知识。...2.堆 堆用来存储相关引用类型new对象。当程序运行时,虚拟机会把所有该程序在运行时创建对象都放到堆。 3.PC寄存器 PC寄存器主要用来存储线程。

    93010

    Linux详解

    实际开发我们所编写程序需要依赖很多基础底层,因此存在有很大意义,避免每次编码都要从头开始 本质上可执行代码二进制形式,这个文件可以在编译时由编译器直接链接到可执行程序,也可以在运行时根据需要动态加载到内存...2.2 共享 Linux下共享.so结尾文件 共享在程序链接时候不会像静态那样拷贝使用代码段和数据段到生成可执行程序,而只是做相应标记,在程序开始执行时,动态地加载所需...因此,可执行程序在运时候需要共享支持。调用共享可执行程序比静态链接出来可执行程序要小,当多个程序调用共享时,运行时所占用内存空间比静态方式要小。...,名称形式一般lib*.so.X.Y(其中X,Y就是代表版本号),每当接口改变时它都会递增。...可以理解为动态加载共享另一种调用方式。DL对于实现程序模块化很有用处,因为它可以让程序在运行时进行模块升级。

    2K40

    CSAPP---第七章-链接

    ,这是对内存极大浪费 共享一个目标模块,在运行或加载时,可以加载到任意内存地址,并和一个在内存程序链接起来。...---- 运行时动态链接和加载某个共享 应用程序还可能在它运行时要求动态链接器加载和链接某个共享,而无需在编译时将那些链接到应用。 动态链接一项强大有用技术。...JNI 基本思想将本地 C 函数( foo)编译到一个共享 foo.so)。...共享目标文件(共享在运行时由动态链接器链接和加载,或者隐含地在调用程序被加载和开始执行时,或者根据需要在程序调用 dlopen 函数时。...被编译为位置无关代码共享可以加载到任何地方,也可以在运行时被多个进程共享。为了加载、链接和访问共享函数和数据,应用程序也可以在运行时使用动态链接器。

    87910

    动态制作与两种使用方式你掌握了吗?

    使用动态 常见有两种使用方式,一种加载时链接,另一种使用时链接。...来源:公众号【编程珠玑】 个人博客:https://www.yanbinghu.com 未经授权禁止任何形式转载 加载时链接 加载时链接在代码不需要做额外动作,像使用静态一样使用即可。...dlopen用于打开一个动态,filename动态名称,flags打开标志,一般为RTLD_LAZY,表示当要调用时候才去解析符号;而RTLD_NOW则在dlopen之前就会去解析,还有其他选项这里就不多介绍了...但是可以看到,程序已经打印了start to call test,然后才报错,说明程序在运行起来之后再尝试去从动态查找test符号。...本文总结如下: 程序运行时不能脱离动态 动态有两种常见使用方式,一种加载链接,一种行时链接 只要函数声明没有改变,动态函数实现更新不需要重新编译可执行文件

    1.5K50

    一种Android App在Native层动态加载so方案

    Java层只加载这个JNI层so,来间接调用功能实现so。 ? so之间通过引用头文件和运行时指定共享依赖方式形成了依赖关系。...加载JNI层so时候,即使这次JNI调用有些功能实现so库里面的数据结构或函数没有被调用到,只要这个so被JNI层so声明为运行时需要依赖共享,也需要跟JNI层so一起被加载,这无形也增大了...由于基类数据结构定义需要事先获知,所以这个so需要作为共享被JNI层so和功能实现so在运行时依赖(具体表现就是在构建这些soAndroid.mk文件,把这个公共定义so指定到LOCAL_SHARED_LIBRARIES...并把析构函数指针和so句柄登记到一个操作接口对象为键值映射表; 当需要释放关闭so时候,映射表取回析构函数指针和so句柄,先调用析构函数释放操作接口对象,然后调用dlclose()函数...至于如何让调用方创建并获取加载so库里子类实例,首先需要在被加载so库里子类实现定义两个前缀带有extern "C"非成员函数,因为在C++带有extern "C"这个前缀函数,在符号名生成处理将跟

    7.3K60

    听GPT 讲Go源代码--types.go

    对于Uint8结构体来说,它主要提供了以下信息和方法: Info:提供了Uint8类型基本信息,类型名称、大小和对齐方式等等。 Kind:表示Uint8类型种类,即无符号整数类型。...该结构体还包含一些有关该类型信息,类型名称、大小和对齐方式等。这些信息可以用于运行时类型检查、内存分配和布局计算等。 在Go语言中,每种类型都有一个对应描述其特征结构体。...对于Uint64结构体,它作用类似于C语言中unsigned long long类型,表示一个64位符号整数。在运行时系统,它可以用于存储各种计数器、标志位以及需要进行位运算数值等等。...调用方可以通过这个对象来获取加载类型名称、大小、方法表等信息。 Store 在Go语言中,Store函数作为一种同步原语,用于在并发程序安全地更新共享变量。...这种动态加载类型信息机制使得Go语言具有非常强大反射能力,可以在运行时动态地获取和操作程序类型信息。

    26340

    《操作系统导论》疑惑解答

    这种“段+页”组织方式允许操作系统在高层使用更直观段来组织程序,同时在底层使用分页来实现高效内存管理和保护。 什么重定位表 重定位表用途在程序加载到内存时,修正程序符号引用地址。...符号表存储了程序定义和引用符号函数和变量)信息,而重定位表则记录了符号引用需要修正地址信息。 当程序加载到内存时,操作系统使用加载器来加载可执行文件,并查看重定位表。...**符号重定向通常用于实现动态加载和卸载、不同程序之间接口转换等功能。 符号重定位如何进行匹配 在链接阶段,链接器会**将目标文件符号引用与实际符号进行匹配,实现正确链接。...**匹配信息主要包括以下方面: 符号名称:链接器会根据符号符号名称进行匹配,确保引用符号与实际符号具有相同名称符号类型:链接器还会检查符号类型匹配性。...链接器会根据这些属性进行匹配,确保引用符号与实际符号具有相同属性。 在AOT静态链接过程,由于链接发生在编译阶段,因此无法在运行时确定符号具体地址。

    8510

    golang plugin源码分析

    什么Go Plugin Golang静态编译型语言,在编译时就将所有引用包()全部加载打包到最终可执行程序(或文件),因此并不能在运行时动态加载其他共享。...Go Plugin提供了这样一种方式,能够让你在运行时动态加载外部功能。go在1.8 支持了这个功能,类似c语言动态链接。...为什么用Go Plugin 其实应该问为什么要用Plugin,我觉得原因有很多,比如: 可插拔:有了Plugin,我程序可以根据需要随时替换其中某些部件而不用修改我程序; 动态加载需要:有些模块只有在运行时才能确定...惟一方法,通过名称symName在插件寻找对应变量或方法,Symbol形式返回 Symbol 根据定义 type Symbol interface{} ,Symbolinterface别名...path err:用于记录过程err loaded:这个用于防止并发加载同一个时候用 syms:这个记录中所有的符号和其对应值(可能var、func等) Open函数,封装了open函数

    96710

    程序生成之编译、链接、加载浅析

    一种特殊可重定位目标文件,可以在链接(静态共享)时加入目标文件,也可以在加载或运行时(动态共享)动态加载到内存并执行; 可执行(Executable)目标文件:由链接器生成,可直接通过加载加载到内存...链接器将函数代码其所在地(目标文件或静态链接)拷贝到最终可执行程序。这样该程序在被执行时这些代码将被装入到该进程虚拟地址空间中。...静态链接实际上一个目标文件集合,其中每个文件含有一个或者一组相关函数代码。...(2) 动态链接 动态链接指链接阶段仅仅加入一些描述信息,而程序执行时再从系统把相应动态加载到内存。 在此种方式下,函数定义在动态链接共享对象目标文件。...动态链接器(ld-linux.so)链接程序在运行过程,根据记录共享对象符号定义来动态加载共享,然后完成重定位。在该可执行文件被执行时,动态链接全部内容被映射到运行时相应进程虚地址空间。

    1.2K60

    Linux rootkit 深度分析 – 第1部分:动态链接器劫持

    这些在运行时解析、加载和链接。负责此操作 Linux 组件动态链接器,也称为ld.so或ld-linux.so.*。让我们自己实验一下:让我们看一下二进制文件ls。...第一个列出依赖项虚拟动态共享对象,这是一个常见共享,由内核自动映射到所有用户空间应用程序地址空间中。最后列出依赖动态链接器位置。2....接下来,运行strace ls,在下面的输出,可以看到相应在执行时加载到内存。...我们将每个条目的名称与“malicious_file”进行比较,如果匹配,则跳过它,从而有效地将该文件输出隐藏起来。 dlsym允许我们在运行时获取共享对象/函数地址。...将运行时文件系统与镜像快照进行比较。如果存在差异,则这些文件可能隐藏在某些命令攻击一部分。 如果在容器上使用运行时检测工具,请确保它支持加载到内存偏移执行库。

    16310

    【云+社区年度征文】一文带你彻底理解反射

    所以,我们对Java反射可以重新理解如下:反射就是程序在运行时,可以根据类全限定名称,动态地加载该类,创建对象,并可以调用该对象地任意属性和方法。 那么,问题来了,为什么要学习反射呢?...正常方式:①引入需要“包类”名称②通过new实例化③获得实例化对象 反射方式:①实例化对象②getClass方法③得到完整“包类”名称 2 、理解Class类并获取Class实例 既然我们要使用反射创建对象...其中验证、准备和解析统称为连接,下面我们详细分析下类加载过程 加载 通过一个类全限定名来获取定义此类二进制字节流 将这个字节流所代表静态存储结构转化为方法区运行时数据结构 在内存中生成一个代表这个类...,要结合具体实际情况自行判断,到底在类加载加载时就对常量池中符号引用解析,还是等到一个符号引用将要被使用前采取解析它。...Class实例所生成 通过Class可以完整地得到一个类所有被加载结构 Class类时Reflection根源,针对任何你想动态加载、运行类,唯有先获得相应Class对象 5、获取行时完整结构

    61210

    Linux虚拟地址空间布局

    内存映射一种方便高效文件I/O方式, 因而被用于装载动态共享。用户也可创建匿名内存映射,该映射没有对应文件, 可用于存放程序数据。...进程地址空间布局可以看到,在有共享情况下,留给堆可用空间还有两处:一处.bss段到0x40000000,约不到1GB空间;另一处共享到栈之间空间,约不到2GB。...当加载器(loader)加载程序时,将为BSS段分配内存初始化为0。在嵌入式软件,进入main()函数之前BSS段被C行时系统映射到初始化为全零内存(效率较高)。...0x08048000以下地址空间通常由C动态链接、动态加载器ld.so和内核VDSO(内核提供虚拟共享)等占用。通过使用mmap系统调用,可访问0x08048000以下地址空间。...其他只读数据程序里图标、图片、文本等资源也可共享。而每个副本进程数据区域不同,它们进程私有的。 此外,临时数据及需要再次使用代码在运行时放入栈区,生命周期短。

    3.3K40

    《深入理解计算机系统》(CSAPP)读书笔记 —— 第七章 链接

    比如,许多软件产品在运行时使用共享来升级压缩包装( shrink- wrapped)二进制程序。...局部C变量在运行时被保存在栈,既不出现在,data节,也不出现在.bss节 .bss:未初始化全局和静态C变量,以及所有被初始化为0全局或静态变量。...运行时堆在数据段之后,通过调用malloc往上增长。堆后面的区域共享模块保留。用户栈总是最大合法用户地址( )开始,向较小内存地址增长。...共享目标文件(共享在运行时由动态链接器链接和加载,或者隐含地在调用程序被加载和开始执行时,或者根据需要在程序调用dlopen函数时。   ...被编译为位置无关代码共享可以加载到任何地方,也可以在运行时被多个进程共享。为了加载链接和访问共享函数和数据,应用程序也可以在运行时使用动态链接器。

    2.6K31
    领券