问题标签 [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.
linux - 为什么 -r 选项(可重定位)使 ld 找不到任何库?
使用 GNU ld 2.21 运行 Debian/Linux x86_64。
很简单,如果我链接到
它有效,但是当我链接时
它抱怨
我实际上并没有尝试以这种方式编译代码,而是试图弄清楚为什么其他人的测试以查看库是否存在不起作用。(因此我不太明白发生了什么ld
……通常我只是使用 GCC 来链接)
为什么告诉ld
以可重定位方式链接会使其突然无法找到库?如果我只是想测试它的-lm
存在,我应该怎么做
这样它会找到图书馆?
如果你想看我正在处理的源码,你可以在这里下载:https ://github.com/jeremysalwen/ESPS (注意,第一次提交是原始源代码,后面的都是更改我亲手制作的。)
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 包但徒劳无功。
有任何想法吗?提前致谢。
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 节中?
android - ar 命令行长度
我有一个非常长的命令行,由 bjam 提供给ar(确切地说是 android ar),而 ar 只是破坏了文件路径并抱怨文件不存在。
有没有办法让 ar 分配更大的命令行缓冲区?
assembly - objdump 和 ARM 与 Thumb
我正在尝试使用 gcc 反汇编为 ARM 构建的对象。不幸的是,objdump 试图猜测代码是否是 ARM 和 Thumb,并且弄错了:它认为我的代码是 Thumb,而实际上它是 ARM。
我看到 objdump 有一个选项可以强制它将所有指令解释为 Thumb ( -Mforce-thumb
),但它没有强制 ARM 模式的选项!
这对我来说似乎是一个非常奇怪的遗漏,并且严重阻碍了我完成工作的能力(我在嵌入式设备上,我唯一的调试方法是查看反汇编)。我尝试了各种方法,包括尝试告诉 objdump 使用不支持 Thumb 的 ARM 架构,但似乎没有任何效果。有任何想法吗?
(是的,我知道这些指令真的是ARM ......)
binutils - nm 和 objdump 的区别
查看手册,objdump
并nm
具有重叠的功能。
你什么时候用每一个?每个命令的最初目的是什么?
perl - 如何使用 IPC::Open2 过滤大量数据?
我的任务是使用外部实用程序(addr2line)从 perl 脚本中过滤一些数据。数据量相当大。我需要将大量数据打印到stdin
程序并读回大量数据(从stdout
程序到我的脚本)。
现在我用 做这个IPC::Open2
,但我不混合阅读和写作。这合法吗?会Open2
在管道中缓冲任何大小的数据吗?
我的代码:
linux - Linux ELF 文件:静态和动态 ELF 程序的哪个字节不同?
我正在使用 linux elf 文件。
我想检测给定的精灵程序是静态链接的(完整的静态链接,ldd
说“ not a dynamic executable
”)还是动态链接的。ELF 适用于嵌入式 Linux,所以我不能只运行它或使用ldd
实用程序。
我想在我的程序中完全做到这一点,通过读取和检查一些字节。我不想依赖file
实用程序或 libelf、binutils 等。
哪些字节会有所不同?
gdb - gdb:它是如何知道变量类型和大小的?
我试图弄清楚这一点,因为我正在尝试用一个自制的脚本做同样的事情(希望如此):
示例 C 代码:
如果我用它gcc -g
和gdb a.out
之后编译它,gdb
确切地知道是什么和在哪里a_ptr
:
它是怎么做到的?我可以通过其他实用程序做同样的事情(知道它的地址和类型)吗?