我有rootfs和klibc文件系统。我正在创建make规则,一些开发人员拥有较旧的编译器,没有互连网络。注意1 我试图验证仅当检测到特定版本的编译器时才使用arm构建所有文件。我已经重建了这棵树好几次了。我正在使用readelf -A并寻找Tag_THUMB_ISA_use: Thumb-1,但这似乎只在arm代码中(但是用互通编译器构建的)以及thumb代码。我可以手动运行objdump -S并检查汇编器以确定正在使用的指令集。
find但是,如果我有一个脚本/工具谓词,以便可以使用 等 来搜索影子文件系统以查找可能丢失的二进制文件,那么事情会容易得多。我认为其中一些信息将位于ELF标题中并可以通过objdump或访问readelf,但我没有找到任何可靠的信息。
具体来说,我正在寻找,
CONFIG_ARM_THUMB。make使用“C”编译器标志的规则会阻塞非拇指编译器。注1:互通允许在thumb和arm模式之间轻松切换,编译器将自动生成代码以支持从任一模式调用。
如果有目标文件,如何在该目标文件的数据段中获取全局变量的初始化值?例如,说我已经完成以下工作:
# 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,但是如何获取加载时获得的实际初始化值呢?
是否可以使用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内核可以在运行时执行与此类似的操作,但我正在寻找构建时解决方案.
正如问题听起来一样。
如果对于任何给定的版本对都没有通用的方法来回答这个问题,那么有人至少可以回答 gcc 3.4.6 和 ld 2.15.92.0.2 是否彼此对应的具体问题?
谢谢。
我正在看问题:-
我得到的错误与这些问题的提问者完全相同。
我正在尝试编译和链接一个程序(我们称之为 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.10为Base。
这意味着当我运行二进制文件时,我得到:
cloudlinux$ ./myprog
./myprog: /usr/lib64/libcrypto.so.10: no version information …Run Code Online (Sandbox Code Playgroud) 对于同一个文件,我认为输出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显示不到size?104508 <105378
我需要更改共享库 (.so) 文件中的某些符号,如下例所示:我需要将abc.so 文件中的符号重命名为 symbol xyz。我有一个工具可以在头文件中替换它,我面临的唯一挑战是更改我的 .so 共享库。对于共享库,是否有任何工具或命令可以帮助我反汇编 .so 文件、更新符号并再次重新组装为 .so 文件?对于共享库,我们需要一种重建符号表的机制。如果有任何工具可以完成我的任务,需要帮助吗?
仅供参考:更改源是最好的方法,但对于短期的解决方案来说,它可以帮助在符号级别替换代码字。