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

如何在使用dlopen加载的共享库中制作gdb打印符号?

在使用dlopen加载的共享库中制作gdb打印符号,可以按照以下步骤进行:

  1. 确保共享库编译时开启了符号表的生成选项。在编译时,使用 -g 参数来生成符号表,例如:gcc -g -shared -o libexample.so example.c
  2. 在共享库中添加一个导出函数,用于打印符号信息。可以在共享库的源代码中添加一个函数,例如 print_symbols(),用于打印符号信息。
  3. 在共享库中使用 dladdr() 函数获取符号信息。在 print_symbols() 函数中,使用 dladdr() 函数获取当前函数的符号信息,包括函数名、库名、偏移量等。
  4. 使用 dlopen() 加载共享库。在主程序中,使用 dlopen() 函数加载共享库,例如:void* handle = dlopen("libexample.so", RTLD_LAZY);
  5. 获取共享库中的 print_symbols() 函数地址。使用 dlsym() 函数获取共享库中 print_symbols() 函数的地址,例如:void (*print_symbols)() = dlsym(handle, "print_symbols");
  6. 调用 print_symbols() 函数打印符号信息。通过函数指针调用 print_symbols() 函数,即可在共享库中打印符号信息。

总结:

在使用dlopen加载的共享库中制作gdb打印符号,需要确保共享库编译时开启了符号表的生成选项,并在共享库中添加一个导出函数用于打印符号信息。通过使用 dladdr() 函数获取符号信息,并使用 dlopen()dlsym() 函数加载和获取共享库中的函数地址,最后通过函数指针调用打印符号信息的函数。这样可以在调试过程中使用gdb打印共享库中的符号信息。

腾讯云相关产品和产品介绍链接地址:

腾讯云提供了丰富的云计算产品和服务,包括云服务器、云数据库、云存储等。您可以访问腾讯云官网了解更多详情:https://cloud.tencent.com/

相关搜索:使用dlopen加载库时收到"未定义的符号"错误在OCaml中通过ctype加载和使用共享库中的符号如何使用GDB调试共享对象库中的函数?使用GDB调试Python的玩具示例c++库时出错(GDB与加载共享库有关的问题?)允许使用dlopen()加载的插件动态链接到自己目录中的共享对象使用GDB打印/查看大型代码库文件中的变量?GDB单步执行到共享库时显示“没有这样的文件”,即使加载了调试符号也是如此。运行时加载的共享库中存在未定义的符号错误在使用gdb时,如何在Pascal中打印数组中的部分值如何在PHP中打印连接的数据库信息(如db名称)?如何在C中获取共享库的名称,符号是在运行时以编程方式从其中加载的?如何在Linux中使用共享库的同一进程的实例之间共享共享库(.so)中的全局变量?如何在Jenkins文件(管道)中使用共享库中的groovy常量?如何在Layers库中不共享权重的情况下使用Sequential?如何在Flutter中使用SQFLITE从数据库开始加载app中的数据?如何在angular 8中共享相同的单例服务实例以及使用该库的项目如何在wildfly服务器中以编程方式热重新加载静态资源(如xhtml )以用于爆炸性战争中出现的库如何在不使用Python3.x中的库的情况下从字符串列表中删除标点符号?如何在Kubernetes(在GCP上)中配置使用持久卷作为“共享文件系统存储库”的elasticsearch快照?如何在R版本3.5.3中将使用tab_df函数(sjPlot库)制作的表格导出为png文档
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

吴章金: 如何创建一个*可执行*共享

: 如何让共享文件也可以直接执行 如何在可执行文件中用 dlopen 解析自身函数 这两个需求汇总起来,可以大体理解为如何让一个程序既可以作为共享,又能够直接运行。...共享目标文件(.so,共享),协同可执行文件创建进程映像 Core dump(core),运行过程崩溃时自动生成,用于调试 我们来看中间两类: 可执行文件 如果不引用外部库函数,那么所有符号地址是确定...,执行加载后可直接运行 共享 如果可执行文件用到外部库函数,那么需要通过动态链接器加载引用到共享并在运行时解析用到相应符号 所以,前者和后者通常情况下是独立存在,是联合行动,两者差异明显:...可执行文件有标准 C 语言程序执行入口 main,而共享则并没有这类强制要求 后者为了确保可以灵活被多个可执行文件共享,所以,符号地址在链接时是相对,在装载时动态分配和计算符号地址 接下来做个实验具体看看两者区别...-rdynamic 等价于 -Wl,-E / -Wl,--export-dynamic,确保所有“符号都 export 到动态符号表,包括当前未用到那些符号

1.1K20

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

前言 在《如何制作属于自己静态简单介绍了静态制作方法,但实际上动态使用更为广泛,至于原因,在《静态和动态区别》一文已有说明。本文介绍动态制作方法以及两种使用方式。...来源:公众号【编程珠玑】 个人博客:https://www.yanbinghu.com 未经授权禁止以任何形式转载 加载时链接 加载时链接在代码不需要做额外动作,像使用静态一样使用即可。...dlsym函数用于从动态查找需要使用函数; dlclose函数用于卸载已加载动态; dlerror函数用于打印动态相关错误。...: 使用dlopen打开动态 使用dlsym找到需要使用符号 调用动态函数 dlopen关闭(卸载)动态 在文本代码,用到了函数指针,相关内容可参考《高级指针话题-函数指针》。...但是可以看到,程序已经打印了start to call test,然后才报错,说明程序是在运行起来之后再尝试去从动态查找test符号

1.5K50
  • Linux下文件制作方法详解

    大家好,继上节,这节我们继续讲解如何在Linux系统上创建我们需要文件 在创建程序之前,需要先来了解GCC一些参数,因为静态共享需要GCC工具产生,并且两者GCC参数不同...,然后/sbin/ldconfig /etc/ld.so.conf是非常重要一个目录,里面存放是链接器和加载器搜索共享时要检查目录,默认是从/usr/lib /lib读取,所以想要顺利运行,...我们也可以把我们目录加入到这个文件并执行/sbin/ldconfig 动态加载 上面共享调用属于动态链接方法,此外我们还可以动态加载,在上一节我们讲过二者区别,此处不做过多讲解。...动态加载需要用到系统API函数 接口 描述 dlopen 打开对象文件,可被程序访问 dlsym 获取执行了dlopen函数对象文件符号地址 dlerror 返回上一次出现错误 dlclose...共享文件放置与共享调用时操作一样 结束语 到目前为止,我们详细讲解了Linux下制作静态共享、以及动态加载,希望通过此文对你在Linux认识有所帮助,那么目的就达到了

    2.1K30

    深入Android源码系列(一)

    这里android调用了android_dlopen_ext方法,来实现动态加载,返回dlextinfo,而非android,则是调用dlopen加载。...这里--prefix-symbols=__dl_ 就是给名字符号上面加入一个前缀,于是我们android_dlopen_ext 就变成了__dl_android_dlopen_ext。...我们调试linker代码,我们因为加载是__dl_android_dlopen_ext ,于是我们gdb下断点 b __dl_android_dlopen_ext ,这样子我们打断点,运行时候会在加载动态时候...file XXX.so (有调试信息,然后我们调试,就会变成有效信息) 05 关于gdb使用,可以参考 http://blog.csdn.net/ghostyu/article/details/...可以多次操作set solib-search-path 然后我们看下当前符号信息 info sharedlib 缺少某个符号使用set solib-search-path继续导入 当没有打上断点时候

    2.1K60

    Linux动态链接.so文件创建与使用

    介绍         使用GNU工具我们如何在Linux下创建自己程序函数?...共享函数 共享函数函数是在当一个可执行程序在启动时候被加载。如果一个共享函数正常安装,所有的程序在重新运行时候都可以自动加载最新函数函数。...这个选项在创建ELF格式文件时候,会将所有的符号加入到动态符号。可以参考ld帮助获得更详细说明。 3.5. 安装和使用共享函数 一旦你定义了一个共享函数,你还需要安装它。...例子调入math函数,然后打印2.0余弦函数值。例子每次都检查是否出错。...so文件创建与使用 Linux动态(.so)搜索路径 Linux 动态与静态制作使用详解

    9.3K51

    入侵检测之syscall监控

    LD_PRELOAD,LD_LIBRARY_PATH(Linux)环境变量或dlfcn应用程序编程接口(API)可用于在过程动态加载共享),该过程可用于拦截来自运行过程。 2....使用命名管道或其他进程间通信(IPC)机制作为通信通道,更复杂样本可以执行多个过程注入以分割模块并进一步逃避检测。...echo ‘print __libc_dlopen_mode(“/root/libcallback.so”, 2)’ | gdb -p pid 用gdb打开进程,并且用__libc_dlopen_mode...使用GDBprint命令,以方便取函数返回值。将它回显到GDB标准输入,它会引起GDB退出,就省得使用quit命令了。...,bash、perl、python等 对应syscall为socketcall 0x08:命令执行之syscall监控 snoopy轻量级lib,用来记录系统中所有执行过命令以及参数,实际使用场景结合

    2.6K10

    linux-沙盒入门,ptrace从0到1

    ptrace使用场景: 编写动态分析工具,gdb,strace 反追踪,一个进程只能被一个进程追踪(注:一个进程能同时追踪多个进程),若此进程已被追踪,其他基于ptrace追踪器将无法再追踪此进程,...当操作系统加载ELF文件时,只有必需部分被映射到内存,不需要部分保留在文件,不需要部分不会映射到内存,在内存不可见。完整符号表包含链接或调试文件所需大量数据,而运行时则不需要。...反转(防): 由于静态加载过于笨重了(可执行文件很大),不是长久之计,如果我们使用动态加载这项技术,就可以回到动态加载文件(文件很小),并且ptrace将不会出现在.symtab和.dynsym表。...动态加载是指在运行时加载并检索库函数地址,我们需要dlopen加载,dlsym解析函数地址,代码如下。...3.使用LD_PRELOAD来劫持ptrace函数调用 这里只针对那些动态链接共享程序,局限性很大,通过创键本地自定义伪造使用LD_PRELOAD来劫持ptrace调用为我们自定义伪造

    4.1K30

    小心两个共享共用同一个静态

    .html(Linux上制作可执行共享示例) 问1:如果测试全局变量global_var是个带构造和析构类对象,会如何?...原因是在使用dlopen动态加载共享时,如果静态包含有全局变量,可能会出现名同地址不同全局变量。 解决办法:总是使用RTLD_GLOBAL加载共享,而不是RTLD_LOCAL。...如果被依赖不是静态,而是共享,则无论何种方式都不存在问题 为何即使RTLD_GLOBAL加载,也会执行两次构造和析构?...原因是两个共享库存在相同代码段,如果被依赖共享,则不存在这个问题 -Wl使用 -Wl表示后面的参数传递给链接器,其中l是linker意思。...表示不丢弃未定义符号和需要重定位符号 --export-dynamic 创建一个动态连接可执行程序时, 把所有的符号加到动态符号

    2.7K50

    GDB实现原理和使用范例

    一、前言 这篇文章为了让你深入了解gdb工作原理,以及如何在linux环境下使用强大gdb调试程序功能。 二、gdb工作原理 2.1....file>读取符号文件 -e执行gdb命令 -readnow,立即加载所有的符号表,启动变慢,以后操作变快 -x:选择符号文件 3.3. gdb工作模式相关 -q 不输出基本信息和版权...如果设置足够多函数断点,可以打印出所有的函数调用关系,然后后处理该脚本输出,可以得到一个函数调用图。这是一个比较快捷方法。 最后args 文件需要保存运行workbinary命令参数。...、信号量,共享内存,文件描述符等) info sharedlibrary(动态) info stack(当前堆栈) 3.4.2....四、gdb使用注意事项 检查有没有生成相对应符号信息-g,如果要调试链接动态符号,也要确保LD_LIBRARY链接编译进了debug信息, gcc编译时候除了开启-g选项,还需要-O0选项表明不进行代码优化

    5.2K10

    linuxso注入与热更新原理 | 直播回顾

    SO文件)在Linux中使用非常广泛,对于后台开发来说,服务器进程往往加载使用了很多SO文件,当需要更新某个SO时往往需要重启进程。...例如要调用dlopen,而dlopen是在libc.so,那么我们第一步就是要找到libc.so所在内存地址。...接着找到dynsym(动态链接符号表),即导出给外部用函数信息,跟着用dynstr定位这些符号名字,这一步就能定位有没有想找函数了,比如在libc里找到dlopen(实际上是__libc_dlopen_mode...puts函数打印结果,我们期望不要调用puts,改为自定义putsnew。...众所周知,Lua数据都是保存在L,除非搞一个全局变量,不然我们调用绑定函数时候,需要指定L,rebind(lua_State * L) rebind函数调用时机?

    1.5K10

    LoadLibrary:一款能够允许Linux程序从DLL文件中加载或调用函数工具

    介绍 今天给大家推荐这个代码将允许原生Linux程序从一个WindowsDLL文件中加载或调用功能函数。下面是一个简单演示示例,我将Windows Defender“移植”到了Linux平台。...工作机制 项目源码peloader目录包含一个来自ndiswrapper自定义PE/COFF加载器,这个可以完成重定位和导入操作,并提供了一个API(dlopen)。...-C++异常扫描和处理; -从IDA加载额外符号链接; -使用GDB进行调试、设置断点和栈追踪; -设置运行时函数钩子; -扫描内存崩溃问题; 如果你需要从外部添加功能,你可以自行编写stubs,实现起来也非常简单方便...构建 我们可以输入make命令来构建测试客户端: $ make 依赖 请注意,后缀.i686和:i386是非常重要,我们需要32位代码使用32位dll。...: (gdb) c 如果你想要在gdb使用硬件断点的话,你可以使用hb或hbreak命令来代替原本break命令。

    4.1K80

    理解JanusPlugin

    在Linux系统,动态加载其实很容易,只要用两个API 就可以了,即 dlopen 和 dlsym 。...* symbol: 指向动态符号函数,变量等 * return: 返回在内存符号地址 */ void* dlsym(void* handle, const char* symbol...); 其中,dlopen 用于将动态加载到内存;dlsym 用于查找被加载到内存动态函数或变量地址。...接下来我们就使用这两个API 来演示一下如何在 Linux 系统下动态加载。 要想做这个演示,首先我们要写一个动态。这个动态库特别简单,就一个函数 add() , 用于加法运算。...接下来我们再来看看如何使用 dlopen 及 dlsym 将上面生成动态加载到内存,并调用它 add() 方法吧。

    1.4K10

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

    加载JNI层so时候,即使这次JNI调用有些功能实现so库里面的数据结构或函数没有被调用到,只要这个so被JNI层so声明为运行时需要依赖共享,也需要跟JNI层so一起被加载,这无形也增大了...这三个函数均在头文件定义,它们作用分别是:dlopen()打开一个动态链接,返回一个动态链接句柄;dlsym()根据动态链接句柄和符号名,返回动态链接库内符号地址,这个地址既可以是变量指针...一般使用加载模式有两个:RTLD_NOW在返回前解析出所有未定义符号,如果解析不出来,dlopen()返回NULL;RTLD_LAZY则只解析当前需要符号(只对函数生效,变量定义仍然是全部解析)。...变量),而JNI层so则通过调用dlopen()动态加载功能实现so; ?...解决方法就是在调用方和被加载so都静态引用公共数据定义,定义一个虚基类作为操作接口。这个类具体子类在被加载so实现,调用方使用基类指针操作被加载so子类实例。

    7.3K60

    Linux共享、静态、动态详解

    介绍 使用GNU工具我们如何在Linux下创建自己程序函数?...共享函数 共享函数函数是在当一个可执行程序在启动时候被加载。如果一个共享函数正常安装,所有的程序在重新运行时候都可以自动加载最新函数函数。...这个选项在创建ELF格式文件时候,会将所有的符号加入到动态符号。可以参考ld帮助获得更详细说明。 3.5. 安装和使用共享函数 一旦你定义了一个共享函数,你还需要安装它。...例子调入math函数,然后打印2.0余弦函数值。例子每次都检查是否出错。...当有“反向相关性”时,您需要使用此选项,即,DL具有未解决符号,按照惯例,必须在要加载这些程序定义它们。对于“反向相关性”工作,主程序必须使其符号动态可用。

    8.9K11

    dlsym用法_DLSS模式

    大家好,又见面了,我是你们朋友全栈君。 dlsym dlsym,dlvsym – 从一个动态链接或者可执行文件获取到符号地址。...返回值是这个符号加载到内存地址。如果这个符号 在指定目标 或者 在由dlopen(3)装载指定目标时自动装载其他共享目标中都没有找到,dlsym()返回NULL指针。...handle参数可能使用如下两种特殊伪句柄: RTLD_DEFAULT 使用默认共享目标搜索顺序来找到要找符号第一次出现地方。...这个搜索范围包含可执行文件全局符号以及这个可执行文件依赖项(也就是使用RTLD_GLOBAL标志动态加载共享目标) RTLD_NEXT 在当前搜索顺序找,在当前目标之后,要找符号下一次出现地方...这就允许向在另一个共享目标函数提供一层封装。这样一来,在一个预先加载共享目标定义函数,就可以找到并调用在另一个共享目标真函数(其实就是一种劫持呢!!!!)。

    96020

    ArkUI实战开发-NAPI 加载原理(上)

    笔者在前 6 小结讲述了NAPI 基本使用,包括同步和异步实现,本节笔者从源码角度简单讲解一下NAPI 加载流程,源码版本为 ArkUI 4.0 Release 版本。...动态加载原理编译后 libentry.so 是什么时机加载呢?... 平台为例,直接调用系统 dlopen() 方法加载共享并把句柄返回,dlopen() 方法简单说明如下:dlopen() 方法是一个在 Unix-like 系统(包括 Linux)中用于动态加载共享...(.so 文件)函数,它允许程序在运行时动态地加载和卸载共享,以及查找共享符号(例如函数和变量)。...当使用 dlopen() 方法加载一个共享(.so 文件)时,它会执行该中所有的全局构造函数(也称为初始化函数),这些构造函数通常用于初始化静态数据或执行其他一次性设置。

    10620

    日更系列:如果gdb打印不出std容器怎么办

    c++我们经常会使用gdb来截获进程,进行单步调试然后打印出过程数据供分析。但是有时候在系统出并不能很好打印出std容器数据。...以下这段用引用自该帖子: 很好地打印出数据结构是一些GDB扩展 机制Python 代码函数。GDB 手册中有一节介绍了GDB漂亮打印。...事实证明,对于共享(也可能对于静态链接,尚不完全清楚)GDB 有一种方法可以自动加载它们。...在线手册有一个相当广泛部分,关于用 Python编写你自己 GDB 漂亮打印机。 那么我使用以下命令看下是否gdb启动时候加载了这个pretty-printer。...可以打印机器会输出下列: image.png 我在一台不可以打印机器就输出。 image.png 所以这里我们需要找到系统printers.py路径,并使用source加载它。

    1.7K20
    领券