标签: binutils

为 Thumb OR Arm 编译的 ARM ELF 脚本/工具谓词

我有rootfsklibc文件系统。我正在创建make规则,一些开发人员拥有较旧的编译器,没有互连网络。注意1 我试图验证仅当检测到特定版本的编译器时才使用arm构建所有文件。我已经重建了这棵树好几次了。我正在使用readelf -A并寻找Tag_THUMB_ISA_use: Thumb-1,但这似乎只在arm代码中(但是用互通编译器构建的)以及thumb代码。我可以手动运行objdump -S并检查汇编器以确定正在使用的指令集。

find但是,如果我有一个脚本/工具谓词,以便可以使用 等 来搜索影子文件系统以查找可能丢失的二进制文件,那么事情会容易得多。我认为其中一些信息将位于ELF标题中并可以通过objdump或访问readelf,但我没有找到任何可靠的信息。

具体来说,我正在寻找,

  1. 编译的“C”如果没有 Linux 系统就无法运行CONFIG_ARM_THUMB
  2. make使用“C”编译器标志的规则会阻塞非拇指编译器。

注1:互通允许在thumbarm模式之间轻松切换,编译器将自动生成代码以支持从任一模式调用。

arm binutils

3
推荐指数
1
解决办法
2025
查看次数

如何从目标文件中获取全局变量的初始化值?

如果有目标文件,如何在该目标文件的数据段中获取全局变量的初始化值?例如,说我已经完成以下工作:

# I'm interested in the variable foo inside bar.o in libbar.a:
$ ar -x libbar.a bar.o
$ nm --print-size bar.o | grep foo
00000048 00000004 D foo
Run Code Online (Sandbox Code Playgroud)

这告诉我foo在大小为4的数据段中的偏移量为0x48,但是如何获取加载时获得的实际初始化值呢?

global-variables binutils object-files

2
推荐指数
1
解决办法
1308
查看次数

试图禁止指令

是否可以使用GNU工具(gcc,binutils等)将所有出现的汇编指令修改为无操作?具体来说,带-pg选项的gcc会生成以下程序集(ARM):

   0x0: e1a0c00d    mov ip, sp
   0x4: e92dd800    stmdb   sp!, {fp, ip, lr, pc}
   0x8: e24cb004    sub fp, ip, #4  ; 0x4
   0xc: ebfffffe    bl  0 <mcount>
Run Code Online (Sandbox Code Playgroud)

我想记录最后一条指令的地址,然后将其更改为nop,如下面的代码所示

   0x0: e1a0c00d    mov ip, sp
   0x4: e92dd800    stmdb   sp!, {fp, ip, lr, pc}
   0x8: e24cb004    sub fp, ip, #4  ; 0x4
   0xc: e1a00000    nop         (mov r0,r0)
Run Code Online (Sandbox Code Playgroud)

Linux内核可以在运行时执行与此类似的操作,但我正在寻找构建时解决方案.

compiler-construction assembly linker gcc binutils

1
推荐指数
1
解决办法
1517
查看次数

如何找到哪个版本的 gcc 对应哪个版本的 binutils?

正如问题听起来一样。

如果对于任何给定的版本对都没有通用的方法来回答这个问题,那么有人至少可以回答 gcc 3.4.6 和 ld 2.15.92.0.2 是否彼此对应的具体问题?

谢谢。

我正在看问题:-

有关链接器失败的帮助:.gnu.linkonce.t

请解释此链接错误:在 .rodata 部分中引用

我得到的错误与这些问题的提问者完全相同。

gcc version binutils

1
推荐指数
1
解决办法
869
查看次数

重写编译对象的共享库 undef 符号版本

我正在尝试编译和链接一个程序(我们称之为 myprog),该程序与共享库(在本例中为libcryto 和 libssl,但实际库不相关)链接。我正在Centos 5.5上构建它,但希望在其他类似RHEL的发行版(例如 CloudLinux)上运行相同的二进制文件。两者都具有相同库的版本SO_NAME(即DT_NEEDED版本对应)。

我的问题是这个。当我在 Centos 上编译时,我看到:

centos$ objdump -T myprog | fgrep SSL_new
0000000000000000      DF *UND*  0000000000000000  libssl.so.10 SSL_new
Run Code Online (Sandbox Code Playgroud)

这工作正常,因为:

centos$ objdump -T /usr/lib64/libssl.so.10 | fgrep SSL_new
00000000000447d0 g    DF .text  0000000000000390  libssl.so.10 SSL_new
Run Code Online (Sandbox Code Playgroud)

但是,在 CloudLinux 上:

cloudlinux$ objdump -T /usr/lib64/libssl.so.10 | fgrep SSL_new
00000033a623a120 g    DF .text  0000000000000390  Base        SSL_new
Run Code Online (Sandbox Code Playgroud)

请注意 SSL 符号的版本已从 更改libssl.so.10Base

这意味着当我运行二进制文件时,我得到:

cloudlinux$ ./myprog
./myprog: /usr/lib64/libcrypto.so.10: no version information …
Run Code Online (Sandbox Code Playgroud)

linux linker libc binutils objcopy

1
推荐指数
1
解决办法
2685
查看次数

'size'vs'ls -l'来获取可执行文件的大小

对于同一个文件,我认为输出ls -l xxx总是大于或等于输出size xxx.

但是当我键入ls -l /bin/ls输出时是:

 -rwxr-xr-x 1 root root 104508  1? 14  2015 /bin/ls

对于size /bin/ls,输出是:

   text    data     bss     dec     hex filename
 101298     976    3104  105378   19ba2 /bin/ls

为什么ls显示不到size104508 <105378

linux bash binutils

1
推荐指数
1
解决办法
805
查看次数

重新定义共享库中的符号

我需要更改共享库 (.so) 文件中的某些符号,如下例所示:我需要将abc.so 文件中的符号重命名为 symbol xyz。我有一个工具可以在头文件中替换它,我面临的唯一挑战是更改我的 .so 共享库。对于共享库,是否有任何工具或命令可以帮助我反汇编 .so 文件、更新符号并再次重新组装为 .so 文件?对于共享库,我们需要一种重建符号表的机制。如果有任何工具可以完成我的任务,需要帮助吗?

仅供参考:更改源是最好的方法,但对于短期的解决方案来说,它可以帮助在符号级别替换代码字。

shared-libraries binutils objcopy readelf

1
推荐指数
1
解决办法
1693
查看次数