我对这个主题相当陌生,即 ELF 和任何与 Linux 相关的东西。我正在尝试编写 ELF 文件,并且更喜欢在 WinXP 上执行此操作。
我的问题是,这可以用 MS Visual Studio 完成,包括编译吗?据我了解,ELF文件不能在Windows操作系统上编译。好吧,至少这是我在谷歌研究中发现的。我是否必须设置 Linux 操作系统并在那里进行编译?
我可以使用 objdumo(GNU binutils 的一部分)来分析 WindowsXP 上的任何 ELF 文件吗?
非常感谢任何帮助和链接。
在我的构建链中,我需要这样做:
objcopy -I binary -O $BFDNAME -B $BFDARCH <this> <that>
Run Code Online (Sandbox Code Playgroud)
为了将二进制文件转换为库形式。因为我希望其他人能够使用它,所以我需要知道在运行构建时如何从他们的工具链中获取 $BFDNAME 和 $BFDARCH。我可以通过对我已经构建的文件运行 objdump -f 来在本地获取值,但是有没有更好的方法,不会让我仅仅为了获取配置值而编译废弃文件?
我正在尝试自己编译跨平台工具链。
当我编译binutils-2.22时,它成功了,但为什么出现“检查我们是否正在交叉编译...否”?我想应该是“是”吧?
我的主机是运行ubuntu的i686,我的目标是arm。
~/telink_linux/build-tools/binutils-2.22$ ./configure --prefix=/home/shuaihan/telink_linux/tools --target=arm-linux
checking build system type... i686-pc-linux-gnu
checking host system type... i686-pc-linux-gnu
checking target system type... arm-unknown-linux-gnu
...
checking whether we are cross compiling... no
...
configure: creating ./config.status
config.status: creating Makefile
Run Code Online (Sandbox Code Playgroud)
之后,我“make”和“makeinstall”,创建了arm-linux-*。
谢谢!
使用 mingw 成功构建 binutils/ld 并尝试运行它后,我收到此消息 -
$ ld-new h:/binutils-2.23.1/ld/.libs/ld-new.exe: 无法识别的模拟模式: 支持的模拟:
我浏览了内部文档,据我了解,您需要设置配置或 makefile,以便在构建过程中安装您想要的模拟模式,但我无法弄清楚您实际上是如何做到这一点的。
如果有人能解释这个过程,我将不胜感激。
非常感谢。
我需要在我的项目中包含一个二进制程序。我使用 objcopy 从二进制文件创建目标文件。目标文件可以链接到我的程序中。objcopy 创建适当的符号来访问二进制数据。
例子
objcopy -I binary -O elf32-littlearm --binary-architecture arm D:\Src\data.jpg data.o
Run Code Online (Sandbox Code Playgroud)
生成的符号是:
_binary_D__Src_data_jpg_end
_binary_D__Src_data_jpg_size
_binary_D__Src_data_jpg_start
Run Code Online (Sandbox Code Playgroud)
问题在于符号包含二进制文件的路径D__Src_。当包含来自不同位置的二进制文件时,这可能会有所帮助。但令我困扰的是,当我从不同位置获取文件时,符号会发生变化。由于这将在多个构建站上运行,因此无法使用 --redefine-sym 选项删除该路径。
如何去掉符号名称中的路径?
根据ld手册上的特殊符号.,即Location Counter。
笔记: 。实际上指的是距当前包含对象开头的字节偏移量。通常这是 SECTIONS 语句,其起始地址为 0,因此 . 可以用作绝对地址。如果 。然而,它在节描述中使用,它指的是从该节开始的字节偏移量,而不是绝对地址。因此在这样的脚本中:
Run Code Online (Sandbox Code Playgroud)SECTIONS { . = 0x100 .text: { *(.text) . = 0x200 } . = 0x500 .data: { *(.data) . += 0x600 } }即使“.text”输入节中没有足够的数据来填充该区域,“.text”节也将被分配起始地址 0x100 和正好 0x200 字节的大小。
ld 手册还提到了输出部分的 VMA 和 LMA:
每个可加载或可分配的输出部分都有两个地址。第一个是 VMA,即虚拟内存地址。这是运行输出文件时该节将具有的地址。第二个是 LMA,或加载内存地址。这是该部分将被加载的地址。在大多数情况下,两个地址是相同的。它们可能不同的一个例子是,当程序启动时,数据部分被加载到 ROM 中,然后复制到 RAM 中(此技术通常用于初始化基于 ROM 的系统中的全局变量)。在这种情况下,ROM 地址将是 LMA,RAM 地址将是 VMA。
所以我的问题是:
如果使用不同的 VMA 和 LMA 指定输出节,则字节偏移的基地址是多少.?
在下面的示例中,该.data部分具有不同的 VMA 和 LMA。我的理解是PLACE 1指定LMA …
我试图从 Linux 程序的 elf 文件中提取特定的字符串变量(即符号),甚至从它来自的 .o 中提取。它在 .rodata 部分,显然我知道符号名称。是否有一系列 objdump 样式的命令和选项可用于转储字符串?
更新:
例如,.map 文件包括:
.rodata.default_environment 0x000000001013f763 0x615 common/built-in.o
0x000000001013f763 default_environment
Run Code Online (Sandbox Code Playgroud)
变量本身 - default_environment- 是标准的以空字符结尾的文本字符串。
gcc 和 binutils 中有许多关于调试信息压缩的标志。在这里,我对标准类型的 C++ 项目中以下四个标志之间的相互作用感兴趣,该项目使用编译器创建许多目标文件,然后使用编译器驱动链接步骤,将目标文件组合成各种最终二进制文件:
-Wa,--compress-debug-sections=zlib-gabi-Wa,--nocompress-debug-sections-Wl,--compress-debug-sections=zlib-gabi-Wl,--compress-debug-sections=none所以,我们可以想象四种可能性。我们已经在汇编器中不压缩或使用 编译了目标文件-Wa,--compress-debug-sections=zlib-gabi,并且在链接器中不压缩或-Wl,--compress-debug-sections=zlib-gabi启用了将目标文件链接到二进制文件中。
-Wa,--nocompress-debug-sections编译 和 的组合-Wl,--compress-debug-sections=none很无趣。据推测根本没有发生压缩。
接下来的两个组合更有趣:
对于-Wa,--compress-debug-sections=zlib-gabi汇编器和-Wl,--compress-debug-sections=none链接器,链接器似乎需要花时间从每个对象文件中解压缩调试信息,然后再合并它并为最终二进制文件发出新的未压缩调试信息部分。
对于-Wa,--nocompress-debug-sections汇编器和-Wl,--compress-debug-sections=zlib-gabi链接器,很明显汇编器不会花时间压缩目标文件的调试信息,而链接器将花时间压缩最终合并的调试信息部分。
我对这两种情况的假设和理解大部分都是正确的吗?如果不是,我误解了什么?
这就留下了最有趣的情况:
-Wa,--compress-debug-sections=zlib-gabi汇编器和-Wl,--compress-debug-sections=zlib-gabi链接器,这里会发生什么?如果我对上述情况的理解是正确的,我希望汇编器会完成压缩每个目标文件中的调试信息的工作,然后链接器需要花时间解压缩它,然后进行合并,最后重新压缩合并调试信息部分。那是对的吗?或者链接器是否能够以某种方式神奇地直接将目标文件中的压缩调试信息部分直接合并到链接步骤的最终压缩调试信息部分中,从而避免解压缩/重新压缩循环?总的来说,我只是想了解应该在构建系统中将这些标志默认为什么以获得最佳构建性能。我当然会做一些基准测试,但我也有兴趣了解这里的操作理论,因为它将帮助我了解围绕这些标志的任何构建基准测试结果。
我正在构建一个共享 (.so) 库,该库由多个 .a 文件和调用它们的瘦 API 层组成。我只希望我的 API 和外部依赖项可见,因此我使用 GCC 提供的“隐藏”可见性构建代码 ( -fvisibility=hidden)。
然而,其中一个库是专有的第三方 .a 文件(我们已付费使用),我只能访问其二进制文件。当我将其静态链接到我的 .so 文件中时,它的符号在我的 .so 的动态符号表中可见。我猜测这是因为该库不是使用隐藏的可见性选项构建的。我宁愿将这些功能隐藏起来,因为它们管理我们软件的敏感部分,并且我不希望第三方链接到这些符号。
有什么方法可以在事后将这些符号标记为“隐藏”,以便它们不会出现在我的 .so 文件的符号列表中?我已经看过了objdump,objcopy但我很难理解这些术语。
我尝试过的其他事情:
我正在尝试在Solaris sun4u sparc SunOS 5.10上从http://ftp.gnu.org/gnu/binutils构建binutils 2.21.1a .我使用的是gcc 4.0.2版.当我构建这是错误:
cc1: warnings being treated as errors
compress.c: In function 'bfd_compress_section_contents':
compress.c:100: warning: implicit declaration of function 'compressBound'
make[2]: *** [compress.lo] Error 1
make[2]: Leaving directory `/nfs/netapp0/user/home/hart/downloads/binutils-2.21.1/bfd'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/nfs/netapp0/user/home/hart/downloads/binutils-2.21.1/bfd'
*** Error code 2
make: Fatal error: Command failed for target `all'
Run Code Online (Sandbox Code Playgroud)
我添加--disable-werror到配置行尝试绕过它,并希望继续构建.不幸的是,这也没有用,我在链接时得到了这个新的,相关的错误:
Undefined first referenced
symbol in file
compressBound ../bfd/.libs/libbfd.a(compress.o)
ld: fatal: Symbol referencing errors. No output written to size
collect2: ld …Run Code Online (Sandbox Code Playgroud)