问题标签 [binutils]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 来自 addr2line 的错误行号
我试图在 C++ 程序的回溯中找到调用的确切行。现在我正在使用这些行(来自 backtrace 的手册页)来获取跟踪:
在 bt_strings 我找到表格的行
现在我获取地址(十六进制字符串)并将其提供给 addr2line。这有时会导致明显错误的行号。互联网搜索使我找到了这篇文章,其中表明
指示该行的实际位置,或者更确切地说,该符号已移动到当前行的行数。
编辑:当我编译时会发生这种情况-g -O0
,即明确地没有优化。编译器是gcc 4.6.3
我想念的另一个编译器标志吗?
我的问题如下:我需要自动化这个。我需要我的程序来创建回溯(完成),提取文件(完成)和行号(失败)。
我当然可以调用readelf
并解析输出,但这并不适合,因为输出因符号而异,具体取决于具体发生的情况。有时符号的地址在一行中,而有关行偏移的信息在下一行...
总结一下:
是否有一种优雅的方法可以在运行时从程序内部获取回溯中函数调用的确切行号?
编辑:示例代码:
编译并运行:
输出:
测试例如 0x400ef0 与 addr2line 产量
这是正确的文件,但错误的行号。在实际应用中,行号可以前后相差很多行。
编辑:编译-S
显示相关部分是:
等显示的addr2line
是返回地址,如后面的行所示call
。我想获得“入口”行,即之前显示的内容!
compilation - Objcopy,它如何进行二进制输出?
由于我是 binutils、gcc 和其他人的新手,所以我有一些一般性的问题,以及我在手册中没有找到的答案。
我正在使用 C 和程序集(nasm 语法),我需要输出原始二进制文件。首先,我将代码编译为带有参数的objec文件:
然后我使用简单的脚本链接所有文件,该脚本只将段按需要的顺序排列。
为了获得原始二进制文件,我使用 objcopy
总而言之,我只需要包含 .text 和 .data 段的二进制文件以及 32 位代码。
1.我能以这种方式得到我想要的吗?
2.还有其他方法吗?(无论更简单或更复杂)
谢谢你的帮助。
我没有编译 Asm 代码的问题,几乎所有的 C 代码问题。
c - binutils/bfd.h 现在想要 config.h 吗?
我正在尝试使用 BFD 库,因此我已经安装了软件包binutils-dev
并包括:
并且正在从我的代码中调用bfd_openr
等等。bfd_close
最近我升级了软件包,现在我从这里收到一个错误:
bfd.h:
...我应该包括config.h
- 但我没有使用 autoconf。
我是否包含错误的头文件?你应该如何使用 binutils-dev?
这是一个演示程序:
尝试编译运行如下:
gcc - 在 Solaris 10 上使用 Binutils 构建失败
我已经在 Solaris 10 上成功构建并安装了最新的 binutils-2.22。
但是当我尝试使用已安装的程序时ld
,or
我得到一个运行时错误:
我已经广泛搜索错误,但所有点击似乎与我的问题无关。
从我所读到__clz_tab
的似乎与“libgcc”有关。
至少 libgcc 包含符号clz
.
任何人的想法?
arm - GCC 使用 ARM VFP 指令操作的正确内联汇编约束是什么?
我想使用 Google NDKv8b 附带的工具链 (gcc-4.6) 将双精度寄存器 (d8) 的值加载到 ARM 平台上的 C 变量中。我的 ARM 机器是三星 Galaxy S2(它有 VFPv3 和 NEON)。GCC 文档说,为了在内联汇编中使用 VFP 双精度寄存器,必须使用“w”约束。所以我尝试了这样的事情(好吧,不要过多地研究整个程序的逻辑):
好吧,它甚至没有编译:
我怎样才能做到这一点?
谢谢!
linux - ELF 动态加载器符号查找排序
解析动态重定位时符号查找的搜索顺序是什么?
当解析共享库的符号时,加载器首先在“主可执行文件”中搜索(让主可执行文件覆盖定义......)还是什么?
linux - ELF 重定位 - 这些符号从何而来?
在我的 Debian x86 32 位中,当我执行 readelf -r /usr/lib/libstdc++.so.6 | grep pthread,我得到这个输出:
但是,当我列出 /usr/lib/libstdc++.so.6 libpthread 的依赖项时,没有列出:
那么动态加载器是如何解决这些依赖关系的呢?我发现了与 __gmon_start__ 类似的问题,粗略地说,这个符号的定义在哪里?
g++ - 与 --as-needed 链接时未解决对 FFTW 的引用
我有一个无法解释的链接问题。该程序在名为 fft.cpp 的文件中包含对 FFTW 函数的引用。链接命令如下(我跳过了其余的目标文件):
多余的 -Wl,-Bstatic -Wl,-Bdynamic 选项由 Waf 生成,我将其用作构建系统。我使用 Ubuntu 12.04 附带的默认工具链:GCC 4.6.3、binutils 2.22。
问题是链接器没有检测和解析对 FFTW 函数的引用。运行时,程序中止并显示以下消息:
的输出ldd
显示 FFTW 根本没有被链接:
这显然是链接器的错误,因为输出nm
显示它包含对 FFTW 的引用:
我发现这可能与链接器选项有关,该选项--as-needed
自 Ubuntu 12.04 以来默认传递 - 事实上,当我添加-Wl,--no-as-needed
到命令行时,问题就消失了。但是,这种解决方法应该不是必需的。我不明白为什么链接器无法正确链接 FFTW 与--as-needed
启用。任何人都可以对此有所了解吗?这是链接器错误吗?为什么只有 FFTW 库受到影响?
c - 什么是“__gmon_start__”符号?
我正在编译这段代码gcc hello.c -o hello -O3
:
当我列出我得到的重定位时:
当我列出此文件中的符号时,我得到:
gmon_start
与gprof有什么关系吗?为什么即使我没有用-pg
or编译/链接,它也会为那个符号重新定位-g
?哪个库会解析这个符号?
gcc - 在 JVM 上运行 GCC 和 binutils
我想知道这是否是一种在 JVM 之上运行 GCC 编译器套件和 binutils 的方法,以便编译器生成 x86/ARM/MIPS 二进制文件作为其输出。这就像交叉编译,但主机系统将是 JVM 而不是本机主机系统。编译器的目标是 x86/ARM/MIPS/GCC 支持的任何东西。
这至少对需要为目标系统使用交叉编译器的嵌入式程序员是有益的。目前需要为主机系统构建 GCC,并为目标指令集 (ISA) 再次构建。如果 GCC 将在 JVM 上运行,那么无论是在 Linux、Windows、BSD、Unix 还是任何支持 JVM 的系统上运行,编译器都可以不加修改地运行。
这也可能有助于为各种主机系统移植 GCC 编译器套件,因为它只需要支持 JVM 作为运行环境。
有什么意见或想法吗?