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

如何将调试符号从C静态库中分离出来,并在以后将其加载到GDB中

将调试符号从C静态库中分离出来,并在以后将其加载到GDB中,可以通过以下步骤实现:

  1. 生成带有调试符号的静态库:在编译C静态库时,使用编译器选项 -g 来生成带有调试符号的目标文件。例如,使用 GCC 编译器可以执行以下命令来生成静态库文件:
  2. 生成带有调试符号的静态库:在编译C静态库时,使用编译器选项 -g 来生成带有调试符号的目标文件。例如,使用 GCC 编译器可以执行以下命令来生成静态库文件:
  3. 这将生成一个名为 liblibrary.a 的静态库文件,其中包含了调试符号。
  4. 分离调试符号:使用工具 objcopy 将调试符号从静态库中分离出来。执行以下命令:
  5. 分离调试符号:使用工具 objcopy 将调试符号从静态库中分离出来。执行以下命令:
  6. 这将生成一个名为 liblibrary.debug 的文件,其中包含了静态库的调试符号信息。
  7. 将调试符号加载到 GDB 中:在需要调试的时候,将调试符号加载到 GDB 中。执行以下命令:
  8. 将调试符号加载到 GDB 中:在需要调试的时候,将调试符号加载到 GDB 中。执行以下命令:
  9. 这将加载 liblibrary.debug 文件中的调试符号信息,使得 GDB 能够正确解析静态库中的符号。

调试符号的分离和加载可以帮助开发人员在调试过程中更好地理解和分析代码。它们可以提供函数名、变量名、行号等信息,使得调试过程更加方便和准确。

腾讯云提供了一系列云计算产品,其中包括云服务器、云数据库、云存储等。这些产品可以帮助用户快速构建和部署各种应用。具体推荐的腾讯云产品和产品介绍链接地址可以根据具体需求和场景进行选择。

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

相关·内容

【Linux】Linux 编译器与调试器 -- gccg++gdb 的使用

动态静态 3、gcc/g++ 的使用 二、Linux调试器 - gdb 使用 1、debug 和 release 2、gdb 的使用 一、Linux编译器 - gcc/g++ 使用 1、程序运行的四个阶段...静态链接则是直接将本程序内部要使用的库函数对应的静态拷贝一份过来;它的优点是不与静态产生关联,即不受静态变动 (删除、升级等) 的影响;缺点是形成的可执行程序非常大。...,进行静态链接时只能拷贝静态的函数。...Linux 一般都会自动安装C语言动态,因为Linux下的大多数指令以及我们默认使用 gcc 编译得到的可执行程序都是进行动态链接,依赖C动态的;但是C静态C++静态可能就需要我们自己安装了。...yum install -y gdb gdb 调试的常见选项如下: l 行号:指定的行号开始往下显示源代码,每次显示10行 (l – list);(注:gdb 有自动记忆命令的功能,即当我们第一次使用

1.7K00

Bread:一款功能强大的BIOS逆向工程和高级调试工具

关于bread Bread是一款功能强大的BIOS逆向工程和高级调试工具,该工具也是一个“可注入”的实模式(Real-Mode)x86调试器,可以帮助广大研究人员通过串行线缆另一台电脑调试任意实模式代码...考虑到目前社区很多BIOS逆向工程工具都是使用反汇编程序静态完成的,这就导致理解BIOS上下文环境会变得非常的困难,而且也无法得知给定代码寄存器或内存的值。因此,Bread便应运而生。...其中,调试器完全使用汇编语言开发,可以在硬件上运行,而桥接器则使用C语言开发,可以在Linux操作系统上直接运行。...桥接器则是调试器和GDB之间的链接,桥接器通过TCP与GDB通信,并通过串行端口将请求/响应转发给调试器。桥接器的目的是消除GDB数据包的复杂性,并建立一个更简单的协议来与机器通信。.../simbolify.py symbols/ami_ipm41d3.txt ip41symbols.elf 接下来,使用下列方法将其载到GDB: (gdb) add-symbol-file ip41symbols.elf

28410
  • 后台开发:核心技术与应用实践 -- 编译与调试

    ,就将库函数装载到程序中去了,而动态库函数必须在运行的时候才被装载,所以程序在执行的时候,用静态速度更快些 makefile文件 一个工程的源文件不计数,其按类型、功能、模块分别放在若干个目录,如何更高效率地编译整个工程...= ,后面跟要设定的这个变量的值即可,以后要引用这个变量,只写一个$符号,后面是在括号里的变量名即可 XX = g++ $(XX) -c helloworld.cpp -o helloworld.o 在.../可执行文件 gdb gdb是gcc 的调试工具,主要用于 CC++ 这两种语言编写的程序。...CC++ 的程序,首先在编译时,必须要把调试信息加到可执行文件。...并且 program 应该在 PATH 环境变量搜索得到 综上,一个简单的使用gdb来进行调试的demo为: gcc -g hello.c -o hello gdb hello 进入gdb调试模式后

    75810

    使用 GDB + Qemu 调试 Linux 内核

    Example: CONFIG_EXTRA_LDLIBS="pthread dl tirpc audit pam" 出错的原因是因为我们采用静态编译依赖的底层没有安装,如果不清楚这些有哪些 rpm...GDB 调试 在使用 qemu-system-x86_64 命令启动内核以后,进入到我们编译机器上拷贝过来的 Linux 内核源代码目录,在另外一个终端我们来启动 gdb 命令: [linux-4.19.172...在 “Run” -> “Debug Configurations” 选项,创建一个 ”C/C++ Attach to Application“ 的调试选项。...Project:选择我们刚才创建的项目名字; C/C++ Application:选择编译 Linux 内核带符号信息表的 vmlinux; Build before launching:选择 ”Disable...启动 ”Debug“ 调试以后的窗口如下,在 Debug 窗口栏,设置与 gdb 调试相同的步骤即可。 ? 6.

    6.9K20

    ELF文件及android hook原理

    链接视图和执行视图 ELF文件在磁盘中和被加载到内存并不是完全一样的,ELF文件提供了两种视图来反映这两种情况:链接视图和执行视图。...符号表(.symtab) 在链接的过程需要把多个不同的目标文件合并在一起,不同的目标文件相互之间会引用变量和函数。在链接过程,我们将函数和变量统称为符号,函数名和变量名就是符号名。...在Linux下,ELF可执行未见默认地址0x08048000开始分配。 符号解析与重定位 编译器在将”a.c”编译成指令时,它如何访问”shared”变量?如何调用”swap”函数?.../** 使用静态链接的方式将其编译成可执行文件: $gcc -static SectionMapping.c -o SectionMapping.elf **/ #include ...GDB调试分析延迟绑定机制 为了加深理解可以用GDB动态调试,Examine下断点前后GOT表的内存的变化。 ? ? ?

    3.8K81

    GDB 调试 .NET 程序实录 - .NET 调用 .so 出现问题怎么解决

    # 系统日志 cat /var/log/syslog 刚开始时,大佬提示可能是内存已被回收,函数等没有使用静态来避免 gc 回收,可能在 C 回调之前,C# 的那部分内存就以及回收了。...GDB GNU Debugger,也称为 gdb,是用于 UNIX系统调试 CC ++ 程序的最流行的调试器。....so 文件剥调试信息 在 linux, strip 命令具体就是特定文件剥掉一些符号信息和调试信息,可以使用以下步骤的命令,将调试信息 .so 文件剥出来。...要调试 .NET Core 程序,需要 .pdb 符号文件;要调试 .so 文件,当然也要携带一下符号信息才能调试。..., stripped 如果最后是 stripped,则说明该文件的符号表信息和调试信息已被去除或不携带,不能使用 gdb 调试

    1.3K30

    hook的几种方式及原理学习

    参数,所以会进行打桩,它告诉C预处理器,在搜索通常的系统目录之前,现在当前的目录查找malloc.h 链接时 linux的静态链接器支持使用 –wrap f标志进行连接时打桩,这个标志告诉链接器,把对符号...section , 运行时称segment,segment是运行时把权限相同的section合并了加载到内存,视图上看,两个视图数据是一样的,只不过有两种形态。...下面有使用 gdb 动态调试的过程, 实际过程,可能直接 disas _dl_runtime_resolve 发现没有效果或者找不到函数, 按照内存查 可知 最新的函数名字上有所改变。...gdb调试 plt懒加载过程: ? ? 重定位类型及偏移表 我们如何计算GOT表应该偏移多少呢,又有哪些偏移的类型呢?...导入表的hook有两种方法: 方法一:   通过解析elf格式,分析Section header table找出静态的.got表的位置,并在内存中找到相应的.got表位置,这个时候内存.got表保存着导入函数的地址

    1.9K30

    Linux内核0-使用QEMU和GDB调试Linux内核

    编译调试版内核 对内核进行调试需要解析符号信息,所以得编译一个调试版内核。...于是有了initramfs根文件系统,其中包含必要的设备驱动和工具,boot loader加载initramfs到内存,内核会将其载到根目录/,然后运行/init脚本,挂载真正的磁盘根文件系统。...编译BusyBox,配置CONFIG_STATIC参数,编译静态版BusyBox,编译好的可执行文件busybox不依赖动态链接,可以独立运行,方便构建initramfs。...然而在调试调了下,发现这种机制早已经被废弃掉了。thread_info结构体只剩下一个字段flags,进程描述符字段task已经删除,无法通过thread_info获取进程描述符了。...(gdb) apropos lx stackoverflow网站上找到一篇文章gdb-lx-symbols-undefined-command,里边提到: gdb -ex add-auto-load-safe-path

    2.4K10

    深入浅出GDB调试

    但是在实际应用GDB 更常用来调试CC++程序。虽然说在Linux系统下我们可以借助诸多集成开发工具来完成程序的编写和调试,但实际上,调试C/C++程序一定是直接或者间接使用GDB完成的。...我下载的太慢了,半小时才下载三分之一,所以后面就只说命令了。...但是,我们正常使用gcc命令编译出来的可执行文件是无法通过gdb调试的,因为这样编译出来的可执行文件缺少gdb调试所需要的调试信息(比如每一行代码的行号、包含程序中所有符号符号表等信息)。...④ b file.c:function 在 file.c 文件名为 function 的函数处断点。...这个命令在C++调试的时候,用于给所有重载函数断点非常方便。也可以文件名来限制为哪个文件的所有满足表达式的函数断点 rbreak file.c:regex 。

    15210

    很经典的GDB调试命令,包括查看变量,查看内存

    例如,查看文件f2.c的全局变量x的值: gdb) p 'f2.c'::x 当然,“::”操作符会和C++的发生冲突,GDB能自动识别“::” 是否C++的操作符,所以你不必担心在调试C++程序时会出现异常...set print static-members 这个选项表示,当显示一个C++对象的内容是,是否显示其中的静态数据成员。默认是on。...九、GDB环境变量 你可以在GDB调试环境定义自己的变量,用来保存一些调试程序的运行数据。要定义一个GDB的变量很简单只需。使用GDB的set命令。GDB的环境变量和UNIX一样,也是以$起头。...如: set $foo = *object_ptr 使用环境变量时,GDB会在你第一次使用时创建这个变量,而在以后的使用,则直接对其赋值。环境变量没有类型,你可以给环境变量定义任一的类型。...你同样可以使用print命令来访问寄存器的情况,只需要在寄存器名字前一个$符号就可以了。如:p $eip。

    21.2K71

    内核级木马与病毒攻防:Linux可执行文件的ELF格式描述

    ET_EXEC表示可执行文件,它是由多个.o文件链接起来,可以被加载到内存进行执行的进程数据文件;ET_DYN表示动态链接,它里面包含一系列向外导出的函数代码,当进程需要调用其内部函数时会将其载到内存...plt段也叫函数链接表,它告诉系统如何将动态链接库里面的函数加载到内存以便被进程调用,后面会对其进行深入研究。....*段包含的信息用于告诉系统将如何变换某些段的虚拟空间地址;.hash段包含一个哈希表,用来加速对符号的查找,所谓符号是编译器设置的用于记录代码变量类型,取值等信息的数据结构,它属于编译原理的内容,有了符号...symtab对应符号表,它用于指导调试器或系统如何查找调试程序所需的各个符号;.cotrs和.dtors两个段各自包含一个指针,前者指针指向一段初始化代码,在进程的main函数执行前必须先执行初始化代码...由此初始化代码就是黑客或病毒制造者的主要目标,他们会在这个地方注入一种叫PTRACE_TRACEME的代码用于阻止调试器挂载到进程上进行调试

    1.6K10

    国密SSL通信的调试技巧

    对于嵌入式开发和移动开发来说,通常需要在开发机上交叉编译(C/C++开发),将编译的二进制程序下载到设备上运行,一般没有Windows开发那样的IDE。...如果要用gdb调试,有可能还需要用到gdbserver,配置gdb和gdbserver之间的通信,配置代码的调试符号路径等等。...编译带调试符号的二进制程序在文章搭建国密SSL开发测试环境说明了如何编译GmSSL,编译出来的是release版本,不带调试符号,这样就无法进行单步跟踪。...或 b 设置断点 r 运行程序 n 单步运行 c 断点出运行,直到遇到下一个断点或结束 p 输出变量值 bt 显示断点处的调用栈 还有很多其它命令...) at apps/gmssl.c:177 这是不是比找到可疑代码,然后一句句print语句来得快呢?

    2.7K20

    Linux调试工具

    你可以用nm查看目标文件或可执行文件的各种符号。 你可以用gprof分析各个函数的使用情况,找出性能的瓶颈所在(这需要编译选项)。 4....各方面来看,大多数非常花 哨的图形化调试工具不过是建立在GDB基础上的一个抽象,所以选择哪一种图形化工具完全属于个人爱好。...strip 丢弃目标文件的全部或者特定符号。...由于现代反静态分析技术的复杂性,人们常常将静态分析与动态分析技术结合起来,以利用二者的优势。理想情况下,所有这些工具集成在一个软件包。...只要在代码添加一个头文件并在 gcc 语句中定义了 MEMWATCH 之后,您就可以跟踪程序的内存泄漏和错误了。

    9.9K43

    【小白学C#】浅谈.NET的IL代码

    一、前言   前几天群里有位水友提问:”C#,当一个方法所传入的参数是一个静态字段的时候,程序是直接到静态字段拿数据还是复制的函数栈拿数据“。...四、浅析IL代码   好了,现在让我们回到博客最初抛出的那个问题上面来:“C#,当一个方法所传入的参数是一个静态字段的时候,程序是直接到静态字段拿数据还是复制的函数栈拿数据?”...Stloc 计算堆栈的顶部弹出当前值并将其存储到指定索引处的局部变量列表。 Stloc.0 计算堆栈的顶部弹出当前值并将其存储到索引 0 处的局部变量列表。...Stloc.1 计算堆栈的顶部弹出当前值并将其存储到索引 1 处的局部变量列表。 Stloc.2 计算堆栈的顶部弹出当前值并将其存储到索引 2 处的局部变量列表。...Stloc.3 计算堆栈的顶部弹出当前值并将其存储到索引 3 处的局部变量列表。 Stloc.S 计算堆栈的顶部弹出当前值并将其存储在局部变量列表的 index 处(短格式)。

    3K20

    GDB实现原理和使用范例

    文件声明 AT_decl_line 说这个函数在 foo.c 第879(十六进制36F)行声明 AT_prototyped 为一个 Bool 值, 为 True 时代表这是一个子程序/函数(subroutine...file>读取符号文件 -e执行gdb命令 -readnow,立即加载所有的符号表,启动变慢,以后的操作变快 -x:选择符号文件 3.3. gdb工作模式相关 -q 不输出基本信息和版权...*函数 , 然后退出gdb 举个比较实用的例子: 下面是非常有用的shell脚本用来查找指定函数,并在这些函数上设置断点,然后运行程序,在每次这些函数被调用的时候,打印出5层堆栈。程序结束,自动退出。...最后的args 文件需要保存运行workbinary命令的参数。 funcs=`gdb –batch .....四、gdb使用注意事项 检查有没有生成相对应的符号信息-g,如果要调试链接动态符号,也要确保LD_LIBRARY链接的编译进了debug信息, gcc编译时候除了开启-g选项,还需要-O0选项表明不进行代码优化

    5.2K10

    linux-沙盒入门,ptrace0到1

    图可以看到,即使使用strip 移除了符号表项信息,但是仍会保留.dynsym表的表项 .symtab和dynsym: 符号表类型 说明 .symtab 包含大量的信息(包括全局符号global symbols...但是如果我们在编译时,静态链接文件,ptrace符号就放在了symtab表,我们就可以删除掉对应的符号表项了 ? ? 我们再查看的时候,发现.symtab表没有任何信息!...反转(防): 如果我们给应用程序壳的话,在没有脱壳的情况下,那么IDA FLIRT(文件快速识别与鉴定技术)也无法分析出来,比如常见的upx之类的壳程序!...尝试gdb调试 ? 可以用readelf工具查看符号表 ? 可以看到我们彻底脱离了的范畴,将不会有的调用特征! 反转(攻): 但是牛逼的ida依然能给你标注出来?就问你难受不? ?...演示: 直接sudo gdb hellword3进行gdb调试 然后输入: catch syscall ptrace 然后c继续执行,第一次暂停是发生在刚开始调用ptrace,然后继续n,n,直到返回到主函数

    4.1K30

    深入浅出GCC编译器

    指定包含头文件的路径(绝对、相对路径都可) -l (小写L) 指定名,libxxx.a或libxxx.so -L 包含的路径 -g 生成调试信息,用于gdb调试,如果不加这个选项无法进行gdb调试...libxxx.so 或 libxxx.a ,所以这个参数的使用方法是直接名 -lxxx ,具体使用方法将在我Linux专栏的另一篇文章《自己动手做动态静态详细介绍。...(5)-L 包含的路径 指定动态静态的路径,后面直接路径即可。具体使用方法将在我Linux专栏的另一篇文章《自己动手做动态静态详细介绍。...(6)-g 生成调试信息 这个选项用于gdb调试的时候,只有在编译的时候 -g 选项,才能进行gdb调试。...可以看到,加了 -g 选项后,文件变大了,这是因为里面包含了调试所用的信息,关于 -g 选项的更多知识和 gdb 调试相关讲解,将在Linux专栏的另一篇文章《GDB调试器》详细介绍。

    27510

    MIT 6.828 操作系统工程 2018 fall lab1 part3 内核 笔记 and 中文注释源代码阅读

    这样,尽管内核的虚拟地址足够高,可以为用户进程留出足够的地址空间,但是它将被加载到PC RAM1MB点的BIOS ROM上方的物理内存。...在这个阶段,仅映射前4MB的物理内存; 映射:kern/entrypgdir.c 手写,静态初始化的页面目录和页面表。...###################################################### # 内核(此代码)链接到地址〜(KERNBASE + 1 Meg), # 但引导加载程序会将其载到地址...# # RELOC(x)将符号x其链接地址映射到其在 # 物理内存的实际位置(其加载地址)。...进入之前先跳到上方c代码的 # KERNBASE mov $relocated, %eax jmp *%eax relocated: # 清除帧指针寄存器(EBP) # 这样,一旦我们调试

    80430
    领券