GDB 符号从哪里来?

2023-12-07

当我加载 Fedora 28 时/usr/bin/ls文件导入GDB,我可以访问该符号abformat_init,即使它不作为字符串存在,也不存在于二进制文件的符号表中。

$ file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=d6d0ea6be508665f5586e90a30819d090710842f, stripped, too many notes (256)
$ readelf -S /usr/bin/ls | grep abformat
$ nm /usr/bin/ls
nm: /usr/bin/ls: no symbols
$ strings /usr/bin/ls | grep abformat
$ gdb /usr/bin/ls
[...]
Reading symbols from /usr/bin/ls...Reading symbols from /usr/bin/ls...(no debugging symbols found)...done.
(no debugging symbols found)...done.
Missing separate debuginfos, use: dnf debuginfo-install coreutils-8.29-7.fc28.x86_64
(gdb) info symbol abformat_init 
abformat_init in section .text of /usr/bin/ls

这个符号从何而来?有没有一个程序可以将它们提取到 GDB 之外?


TL;DR:

  1. 有一个特殊的.gnu_debugdataGDB 读取的 Fedora 二进制文件中的压缩部分,其中包含迷你符号.
  2. 该部分的内容可以方便地打印eu-readelf -Ws --elf-section /usr/bin/ls

readelf -S /usr/bin/ls | grep abformat

该命令正在转储sections。你要symbols反而:

readelf -s /usr/bin/ls | grep abformat
readelf --all /usr/bin/ls | grep abformat

strings /usr/bin/ls | grep abformat

Strings 尝试猜测您想要的内容,并且不会输出二进制文件中找到的所有字符串。看这篇博文并尝试:

strings -a /usr/bin/ls | grep abformat

Update:我确认了您观察到的结果:abformat没有出现在任何地方,但 GDB 知道它。

事实证明,有一个.gnu_debugdata 压缩的部分(描述here), 其中有迷你符号.

要提取此数据,通常您会执行以下操作:

objcopy -O binary -j .gnu_debugdata /usr/bin/ls ls.mini.xz

然而,那被打破在我的系统上(产生空输出),所以我使用dd:

# You may need to adjust the numbers below from "readelf -WS /usr/bin/ls"
dd if=/usr/bin/ls of=ls.mini.xz bs=1 skip=151896 count=3764
xz -d ls.mini.xz
nm ls.mini | grep abformat

这产生了:

00000000000005db0 t abformat_init

QED.

附加信息:

  1. 令人困惑的 GDBno debugging symbols解决于this bug.
  2. objcopy拒绝复制.gnu_debugdata是的主题this bug.
  3. There is一个可以方便地转储此信息的工具:

    eu-readelf -Ws --elf-section /usr/bin/ls | grep abformat 37: 0000000000005db0 593 FUNC LOCAL DEFAULT 14 abformat_init

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

GDB 符号从哪里来? 的相关文章

  • Linux shell 脚本:十六进制数字到二进制字符串

    我正在 shell 脚本中寻找一些简单的方法来将十六进制数字转换为 0 和 1 字符的序列 Example 5F gt 01011111 是否有任何命令或简单的方法来完成它 或者我应该为其编写一些开关 echo ibase 16 obase
  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • 从 TypeScript 运行任何 Linux 终端命令?

    有没有办法直接从 TypeScript 类中执行 Linux 终端命令 这个想法是做类似的事情 let myTerminal new LinuxTerminal let terminalResult myTerminal run sudo
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 如何将整个 GDB 会话转储到文件中,包括我输入的命令及其输出?

    在 bash 中 我可以使用script命令 它将 shell 上显示的所有内容转储到文件中 包括 键入的命令 PS1 line 命令的 stdout 和 stderr gdb 中的等效项是什么 我试着跑shell script从 GDB
  • GDB单步汇编并显示下一条将要执行的指令。 [复制]

    这个问题在这里已经有答案了 使用 gdb 调试器可以执行什么命令来单步执行并显示将要执行的下一条指令 我熟悉windbg这个操作非常简单 例如 我有以下函数 当我通过以下方式进入代码时si我想显示将要执行的下一条指令 而无需通过反汇编进行完
  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • Unix 命令列出包含字符串但*不*包含另一个字符串的文件

    如何递归查看包含一个字符串且不包含另一个字符串的文件列表 另外 我的意思是评估文件的文本 而不是文件名 结论 根据评论 我最终使用了 find name html exec grep lR base maps xargs grep L ba
  • 修改linux下的路径

    虽然我认为我已经接近 Linux 专业人士 但显然我仍然是一个初学者 当我登录服务器时 我需要使用最新版本的R 统计软件 R 安装在 2 个地方 当我运行以下命令时 which R I get usr bin R 进而 R version
  • 在 Linux 上更快地分叉大型进程?

    在现代 Linux 上达到与 Linux 相同效果的最快 最好的方法是什么 fork execve combo 从一个大的过程 我的问题是进程分叉大约 500MByte 大 并且一个简单的基准测试只能从进程中实现约 50 个分叉 秒 比较最
  • 抑制 makefile 中命令调用的回显?

    我为一个作业编写了一个程序 该程序应该将其输出打印到标准输出 分配规范需要创建一个 Makefile 当调用它时make run gt outputFile应该运行该程序并将输出写入一个文件 该文件的 SHA1 指纹与规范中给出的指纹相同
  • 在GDB中的每一行设置断点

    有没有办法用GDB在代码的每一行设置断点 明明我不想打b addr对于每一行 所以我想知道是否有一种快速的方法来做到这一点 Edit请注意 我正在运行由其他人创建的二进制文件 并且我无权访问源代码 不幸的是 该二进制文件尚未使用 g 标志进
  • GLIBCXX_3.4.26 未找到在 BeagleBone 上运行交叉编译的程序

    我有以下程序 include
  • 如何使用 xterm.js 创建基于 Web 的终端以 ssh 进入本地网络上的系统

    我偶然发现了这个很棒的图书馆xterm js https xtermjs org 这也是 Visual Studio Code 终端的基础 我有一个非常普遍的问题 我想通过基于网络的终端 不在网络中 可能位于 aws 服务器上 访问本地网络
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c

随机推荐

  • maven pom.xml如何识别非标准项目结构中的testng测试用例?

    我对 Maven 和 testng 完全陌生 我使用 Maven 作为构建工具 使用 testng 作为测试框架 我没有遵循标准的 Maven 项目结构 现在我想要我的pom xml在我的项目中执行测试用例 问题是 如何pom xml知道执
  • 从 firebase 数据库检索计算平均值

    我正在创建一个 iOS 应用程序 该应用程序使用每个地点的地名和评级 我已经把事情做好了 我的意思是 我将数据保存到数据库中 并且我也可以读取它们 唯一的问题是 当我阅读它们时 我希望它们通过计算每个位置的平均值来加载到我的 tablevi
  • postgres:在字符串中搜索多个单词

    我正在为我的公司后台系统实施基本形式的搜索 我想找到包含搜索查询中所有单词的所有产品名称 所以如果我有这两种产品 Deodorant with cucumber flavor Deoderant with apple flavor 搜索查询
  • jquery中如何获取textarea的值?

    我有这个表格 我试图从文本区域获取值 由于某种原因它不想这样做
  • 使用 FileResult 在 Asp.Net MVC 中下载任何类型的文件?

    有人建议我应该使用 FileResult 来允许用户从我的 Asp Net MVC 应用程序下载文件 但我能找到的唯一示例始终与图像文件有关 指定内容类型 image jpeg 但是如果我不知道文件类型怎么办 我希望用户能够从我网站的文件区
  • 如何使用 selenium webdriver 在 C# 中以私有模式启动 IE

    我开始将 selenium Webdriver 与 c 和 Visualstudio 一起使用 我想以私有模式启动 Internetexplorer 所以我在测试期间不必关心旧的浏览数据 我现在搜索了很长时间才找到如何做到这一点 遗憾的是我
  • Fluent NHibernate 强制外键引用不可为空

    刚刚接触一些 Fluent NHibernate AutoMap 约定 并遇到了一些我无法弄清楚的事情 我想我只是没有找对地方 基本上试图在一对多关系的 多 方面强制执行 NOT NULL 看起来 使用自动映射 它总是使数据库中的父属性 I
  • timezone_name_from_abbr() 无法正确识别

    基本上我的网站是全球性的 我需要能够检测用户的时区并显示准确的时间 我有一个非常简洁的脚本 直到现在它都可以完美地工作 它需要一个时区偏移量 我用 javascript 获取并通过 cookie 传递该时区偏移量 if empty COOK
  • Django 管理后端“操作错误”尝试写入只读数据库

    这个问题似乎已被问过很多次 但我检查过的所有解决方案尚未对我有用 我在跑步nginx在安装了 Django 1 6 1 的 Ubuntu 14 04 服务器上 我正在尝试为项目使用默认的 django 管理后端 通常位于 localhost
  • #1067 - “bonusid”的默认值无效,我该如何修复此错误?

    SQL查询 CREATE TABLE bonus bonusid INT 10 DEFAULT 0 NOT NULL AUTO INCREMENT empid INT 10 DEFAULT 0 NOT NULL datebonus DATE
  • 如何通过参数操作保护 REST API 免受重放攻击?

    我正在开发安全支付 API 我希望通过操纵 url 中的参数来避免重放攻击 例如在以下 API 调用中 一旦执行此 API 调用 具有足够知识的人就可以通过修改这三个参数中的任何一个来执行相同的 API 调用 以满足他 她自己的利益 我曾想
  • jquery - 滑动切换不平滑

    我有一个问题slideToggle函数于jQuery 一点也不顺利 每当我单击 查看更多 按钮时 应该显示的内容slideToggle 只是弹出 没有任何效果 这是 HTML 代码 td class third a href class b
  • C++ -- Detours (Win32 API 劫持) -- 劫持类方法

    我很长一段时间都没有遇到 Detours 劫持功能的问题 当我尝试劫持类方法时 在我的例子中是来自 mshtml dll 的 IHTMLDocument2 write 我遇到了无尽的问题 主要是类型不匹配 由于我在网上没有找到任何相关示例
  • Laravel 5:仅在一个 URL 上路由 CORS 问题

    我正在尝试向外部 laravel 站点发出 2 个 ajax 请求 其中一个请求完美运行 列表 另一个 savedevice 给我以下错误 访问 XMLHttpRequest 位于 http localhost somesite devic
  • 计算时间间隔

    我正在构建一些基于这篇有用的帖子 我对数据集有三个相关问题df machine ISOdatetime 1 M1 2013 08 21 18 16 39 2 M1 2013 08 21 18 20 44 3 M1 2013 08 21 18
  • 将 URL 参数传递到 Web 应用程序脚本中

    这个问题让我想拔掉头发 我正在尝试将 URL 参数传递给 Google Apps 脚本 其中包含我想要呈现的数据的行 ID 来自电子表格 我的参数是story 但是 无论我尝试什么 我都会遇到各种各样的错误 最新的是 类型错误 无法从未定义
  • Angular 2:输入每4位数字后添加连字符,卡号输入

    我需要在输入的每 4 个数字后添加一个连字符 我在控制台中得到这个 我怎样才能实现这个以改变角度 2 的输入 我使用的代码如下 ts mychange val var self this var chIbn self storeData i
  • 安装过程中 Activator.CreateInstance 对象的 InvalidCastException

    我有以下程序 private static IMyInterface OpenInstance string assemblyPath string classType string assemblyName out AppDomain d
  • 如何使用修复,它是如何工作的?

    我对文档有点困惑fix 虽然我想我现在明白它应该做什么 所以我查看了源代码 这让我更加困惑 fix a gt a gt a fix f let x f x in x 这究竟是如何返回一个固定点的 我决定在命令行尝试一下 Prelude Da
  • GDB 符号从哪里来?

    当我加载 Fedora 28 时 usr bin ls文件导入GDB 我可以访问该符号abformat init 即使它不作为字符串存在 也不存在于二进制文件的符号表中 file usr bin ls usr bin ls ELF 64 b