问题标签 [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.

0 投票
2 回答
6865 浏览

linux - 为什么 -r 选项(可重定位)使 ld 找不到任何库?

使用 GNU ld 2.21 运行 Debian/Linux x86_64。

很简单,如果我链接到

它有效,但是当我链接时

它抱怨

我实际上并没有尝试以这种方式编译代码,而是试图弄清楚为什么其他人的测试以查看库是否存在不起作用。(因此我不太明白发生了什么ld……通常我只是使用 GCC 来链接)

为什么告诉ld以可重定位方式链接会使其突然无法找到库?如果我只是想测试它的-lm存在,我应该怎么做

这样它会找到图书馆?

如果你想看我正在处理的源码,你可以在这里下载:https ://github.com/jeremysalwen/ESPS (注意,第一次提交是原始源代码,后面的都是更改我亲手制作的。)

0 投票
1 回答
1601 浏览

binutils - binutils 中的错误使交叉编译

我正在尝试编译 binutils 以设置 GNU 工具链,以便在 linux x86 架构上为 ARM 进行交叉编译。

为此,我从以下网址下载了 GNU 工具链:http: //lejosrt.org/tuto/install-gnu-arm-toolchain-under-linux

这需要运行一个脚本来安装和编译所有内容。但是,在运行脚本时,会出现以下错误:

make[2]: 进入目录libiberty.a' make[2]: 离开目录/home/GNU_Toolchain/src/binutils-2.20.51.0.1' make: * [all] Error 2/home/GNU_Toolchain/src/binutils-2.20.51.0.1/libiberty' rm -f ./libiberty.a pic/./libiberty.a ar rc ./libiberty.a \ ./regex.o ./cplus-dem.o ./cp-demangle.o ./md5.o ./sha1.o ./alloca.o ./argv.o ./choose-temp.o ./concat.o ./cp-demint.o ./crc32.o ./dyn-string.o ./fdmatch.o ./fibheap.o ./filename_cmp.o ./floatformat.o ./fnmatch.o ./fopen_unlocked.o ./getopt.o ./getopt1.o ./getpwd.o ./getruntime.o ./hashtab.o ./hex.o ./lbasename.o ./lrealpath.o ./make-relative-prefix.o ./make-temp-file.o ./objalloc.o ./obstack.o ./partition.o ./pexecute.o ./physmem.o ./pex-common.o ./pex-one.o ./pex-unix.o ./safe-ctype.o ./sort.o ./spaces.o ./splay-tree.o ./strerror.o ./strsignal.o ./unlink-if-ordinary.o ./xatexit.o ./xexit.o ./xmalloc.o ./xmemdup.o ./xstrdup.o ./xstrerror.o ./xstrndup.o
*** buffer overflow detected ***: ar terminated ======= Backtrace: ========= /lib/i386-linux-gnu/libc.so.6(__fortify_fail+0x50)[0x40117df0] /lib/i386-linux-gnu/libc.so.6(+0xe4cca)[0x40116cca] /lib/i386-linux-gnu/libc.so.6(+0xe43c8)[0x401163c8] /lib/i386-linux-gnu/libc.so.6(_IO_default_xsputn+0x95)[0x4009b7e5] /lib/i386-linux-gnu/libc.so.6(_IO_padn+0xc8)[0x4008f598] /lib/i386-linux-gnu/libc.so.6(_IO_vfprintf+0x1cd5)[0x40070e35] /lib/i386-linux-gnu/libc.so.6(__vsprintf_chk+0xad)[0x4011647d] /lib/i386-linux-gnu/libc.so.6(__sprintf_chk+0x2d)[0x401163bd] ar[0x804ec04] ar[0x8050d38] ar[0x80585c2] ar[0x804b452] ar[0x804c3fd] /lib/i386-linux-gnu/libc.so.6(__libc_start_main+0xe7)[0x40048e37] ar[0x80494c1] ======= Memory map: ======== 08048000-080b5000 r-xp 00000000 08:01 3940915 /usr/local/bin/ar 080b5000-080b6000 r--p 0006c000 08:01 3940915 /usr/local/bin/ar 080b6000-080b7000 rw-p 0006d000 08:01 3940915 /usr/local/bin/ar 080b7000-080bb000 rw-p 00000000 00:00 0 08efe000-08f9d000 rw-p 00000000 00:00 0 [heap] 40000000-4001c000 r-xp 00000000 08:01 3670837 /lib/i386-linux-gnu/ld-2.13.so 4001c000-4001d000 r--p 0001b000 08:01 3670837 /lib/i386-linux-gnu/ld-2.13.so 4001d000-4001e000 rw-p 0001c000 08:01 3670837 /lib/i386-linux-gnu/ld-2.13.so 4001e000-4001f000 r-xp 00000000 00:00 0 [vdso] 4001f000-40021000 rw-p 00000000 00:00 0 40021000-40022000 r--p 0065c000 08:01 3544340 /usr/lib/locale/locale-archive 40032000-4018c000 r-xp 00000000 08:01 3670850 /lib/i386-linux-gnu/libc-2.13.so 4018c000-4018d000 ---p 0015a000 08:01 3670850 /lib/i386-linux-gnu/libc-2.13.so 4018d000-4018f000 r--p 0015a000 08:01 3670850 /lib/i386-linux-gnu/libc-2.13.so 4018f000-40190000 rw-p 0015c000 08:01 3670850 /lib/i386-linux-gnu/libc-2.13.so 40190000-40195000 rw-p 00000000 00:00 0 40195000-40395000 r--p 00000000 08:01 3544340 /usr/lib/locale/locale-archive 403a6000-403c0000 r-xp 00000000 08:01 3670878 /lib/i386-linux-gnu/libgcc_s.so.1 403c0000-403c1000 r--p 00019000 08:01 3670878 /lib/i386-linux-gnu/libgcc_s.so.1 403c1000-403c2000 rw-p 0001a000 08:01 3670878 /lib/i386-linux-gnu/libgcc_s.so.1 bff19000-bff3b000 rw-p 00000000 00:00 0 [stack] make[2]: *** [libiberty.a] Aborted make[2]: *** Deleting file
/home/GNU_Toolchain/src/binutils-2.20.51.0.1/libiberty' make[1]: *** [all-libiberty] Error 2 make[1]: Leaving directory

我尝试升级 binutils 包但徒劳无功。

有任何想法吗?提前致谢。

0 投票
1 回答
5154 浏览

c - 将部分注入 GNU ld 脚本;binutils 版本之间的脚本兼容性。

我正在构建类似问题如何将不同 .a 文件中的数据收集到一个数组中的内容?如何使用 ld 脚本将部分保存在 .a 文件中?,即在链接时由来自不同目标文件的元素组成的数组。

在我的例子中,有几个数组,每个数组都有自己的部分,.ld_comp_array_*,其中 * 匹配数组的名称。然后我使用 ld --verbose 获取默认链接器脚本,并通过将所有这些部分(已排序,以便不同数组的元素不会混合)放入输出部分来修改它:

一切正常。

然后事情变得有点复杂,因为可以为各种平台构建使用此功能的应用程序 - 到目前为止,我已经成功尝试 AVR Xmega 作为目标平台,以及 Windows 32 位和 Linux 32 - 和用于单元测试的 64 位,并且列表是开放的(可能会在不久的将来添加新平台)。

但是,对于每个特定平台,默认链接器脚本与其他平台上的不同,目前我手动插入 .ld_comp_array* 部分 - 是否有可能以某种方式自动完成?我想到的唯一解决方案是解析默认脚本并粘贴上面的输入部分描述,但这似乎太重了。

如果没有相对简单的解决方案,我可以手动完成,但我不确定从本地版本的 ld 获得的默认脚本是否可能会在不同版本的 binutils 上中断。谁能澄清这是否安全?

如果可以自动完成,假设数组应该是“不可变的”,是否可以将输入节规范始终直接“注入”到 .text 节中?

0 投票
2 回答
598 浏览

linker - 添加到 gnu ld 库搜索路径的 *end*

我知道如何使用 -Ldir 选项添加到 GNU ld 的库搜索路径并广泛使用它。但据我通过阅读gccld的手册可以看出,没有办法添加到库搜索路径列表的末尾

-L 选项添加到开头,然后搜索默认系统库路径。但我想添加一条“如果你无法找到它”的路径,请在此处查看。有没有办法用ld做到这一点?

我可以想象一个 hacky-crap 解决方案,它提取所有标准库目录(使用 -print-search-dirs)并按照我想要的顺序将它们添加到 -L 搜索目录列表中,在它们作为默认搜索路径的隐含重复之前。 ..

必须有更好的方法......

0 投票
1 回答
262 浏览

android - ar 命令行长度

我有一个非常长的命令行,由 bjam 提供给ar(确切地说是 android ar),而 ar 只是破坏了文件路径并抱怨文件不存在。

有没有办法让 ar 分配更大的命令行缓冲区?

0 投票
2 回答
11998 浏览

assembly - objdump 和 ARM 与 Thumb

我正在尝试使用 gcc 反汇编为 ARM 构建的对象。不幸的是,objdump 试图猜测代码是否是 ARM 和 Thumb,并且弄错了:它认为我的代码是 Thumb,而实际上它是 ARM。

我看到 objdump 有一个选项可以强制它将所有指令解释为 Thumb ( -Mforce-thumb),但它没有强制 ARM 模式的选项!

这对我来说似乎是一个非常奇怪的遗漏,并且严重阻碍了我完成工作的能力(我在嵌入式设备上,我唯一的调试方法是查看反汇编)。我尝试了各种方法,包括尝试告诉 objdump 使用不支持 Thumb 的 ARM 架构,但似乎没有任何效果。有任何想法吗?

(是的,我知道这些指令真的是ARM ......)

0 投票
2 回答
9042 浏览

binutils - nm 和 objdump 的区别

查看手册,objdumpnm具有重叠的功能。

你什么时候用每一个?每个命令的最初目的是什么?

0 投票
2 回答
1600 浏览

perl - 如何使用 IPC::Open2 过滤大量数据?

我的任务是使用外部实用程序(addr2line)从 perl 脚本中过滤一些数据。数据量相当大。我需要将大量数据打印到stdin程序并读回大量数据(从stdout程序到我的脚本)。

现在我用 做这个IPC::Open2,但我不混合阅读和写作。这合法吗?会Open2在管道中缓冲任何大小的数据吗?

我的代码:

0 投票
1 回答
630 浏览

linux - Linux ELF 文件:静态和动态 ELF 程序的哪个字节不同?

我正在使用 linux elf 文件。

我想检测给定的精灵程序是静态链接的(完整的静态链接,ldd说“ not a dynamic executable”)还是动态链接的。ELF 适用于嵌入式 Linux,所以我不能只运行它或使用ldd实用程序。

我想在我的程序中完全做到这一点,通过读取和检查一些字节。我不想依赖file实用程序或 libelf、binutils 等。

哪些字节会有所不同?

0 投票
2 回答
885 浏览

gdb - gdb:它是如何知道变量类型和大小的?

我试图弄清楚这一点,因为我正在尝试用一个自制的脚本做同样的事情(希望如此):

示例 C 代码:

如果我用它gcc -ggdb a.out之后编译它,gdb确切地知道是什么和在哪里a_ptr

它是怎么做到的?我可以通过其他实用程序做同样的事情(知道它的地址和类型)吗?