我们在 Linux 下运行一个程序,有时会无法启动,报缺少某某库。这时需要查看可执行程序或者动态库中的符号表,动态库的依赖项, Linux 有现成的工具可用:objdump 。
有时我们拿到一个静态库,想调用其中的函数,而某些函数作用域非全局,也可以通过修改符号来达到目的。 Linux 有现成的工具可用: objcopy 。
下面我们来看看具体怎么使用。
objdump 是 gcc 套件中用来查看 ELF 文件的工具,详细的用法请 google 之,也可以用 objdump --help 查看帮助,或者 man objdump 查看系统手册。这里只举两个我用到的情况。
1). 查看依赖项:objdump -x xxx.so | grep "NEEDED" 。下面是我查看 qq_1.so 时的输出截图:
2). 查看动态符号表: objdump -T xxx.so 。假如想知道 xxx.so 中是否导出了符号 yyy ,那么命令为 objdump -T xxx.so | grep "yyy" 。
3). 查看符号表: objdump -t xxx.so 。-T 和 -t 选项在于 -T 只能查看动态符号,如库导出的函数和引用其他库的函数,而 -t 可以查看所有的符号,包括数据段的符号
objcopy将目标文件的一部分或者全部内容拷贝到另外一个目标文件中,或者实现目标文件的格式转换。
具体用法 google , man ,或者参考这篇强文《Linux命令学习手册-objcopy命令》。
假如我们有个静态库,想做这么几个事儿:把一个函数作用域从全局修改为本地、把一个函数作用域从本地修改为全局、把一个函数的名字修改一下。那么步骤如下:
- ar -x xxx.a //释放其中的.o文件
- objdump -t xxx.o //查看导出符号表,可以看到导出的函数和引用的函数
- objcopy --localize-symbol function_1 xxx.o xxx_new.o //把函数设置为本地
- objcopy --globalize-symbol function_2 xxx.o xxx_new.o //把函数设置为全局可见
- objcopy --redefine-sym old_func=new_func xxx.o xxx_new.o //重命名函数名
- ar cqs xxx.a xxx_new.o //打包为静态库
上面用到 ar 命令,请 google 或 man 。
--------
注:整理一下发个文,以后用到有个地方找。
分享到:
相关推荐
编译出objdump二进制文件,可以直接使用,用于反汇编; 修改权限:chmod +x objdump 使用示例:objdump -d a.out(gcc编译出的可执行文件)
可以使用如下命令:-D 表示对全部文件进行反汇编,-b 表示二进制,-m 表示指令集架构,a.bin 就是我们要反汇编的二进制文件objdump -m 可以查看
Linux-objdump是gcc工具,用来查看编译后目标文件的组成
objDump是一个轻量级JAVA程序,可以把任何JAVA对象转换为字符串。经常用于反编译bin文件。
ObjDump 1. Synopsis ----------------------------------------------------------------------------------- ObjDump is a small Java framework that dumps any Java object to a string. 2. Usage ---------...
objdump,gnu 开发工具包中的反汇编调试工具,详细描述objdump的调试定位方式,只要是gcc编译都可以参照使用,当应用程序或者共享库发生异常时,利用objdump的调试定位方式可以事半功倍。
gdb的使用方法,通过使用gdb可以调试微小的错误,尤其是段错误
Crash问题分析,总结objdump使用方式
如果你想使用与 nm 2.24 相同的,你可以使用my_nm --sort=24 。 请注意, objdump可能会因文件被截断而崩溃。 可能会出现一些差异,为了显示它们,您可以使用两个脚本scripts/nm.sh和scripts/objdump/sh作者布罗吉_...
ELF readelf objdump
这些是您在查看GDB回溯时可能会看到的符号,或者可能是从nm , objdump等查看符号表的结果。 用法 用法示例: $ demangle _ZNSt8ios_base15sync_with_stdioEb _ZNKSt5ctypeIcE13_M_widen_initEv std::ios_base::...
嵌入式开发熟的binutils工具集 — objdump
nm-objdump 个人和实现。 细节 我在 EPITECH (2010-2011) 的第二年实现了一个有趣的小项目,以了解有关目标文件的更多信息。 该项目是为在 Linux (Fedora) 上编译和运行而开发的。 用法 运行 Makefile 来编译两个可...
拆卸shellcode的小工具(使用objdump) Use: ./shellconv.py [inFile] [arch:optional] [outFile:optional] arch: defined as in objdump -m, default: i386 免责声明该工具旨在简化。 如果shellcode复杂/混淆,它...
转储SC DumpSC是一个简单的bash脚本,可使用objdump从二进制文件中提取Shellcode并复制到剪贴板上,以备将来注入 用法: bash dumpsc.sh <binary>
一些内核编译的常用选项用法 开发环境概述 因为 Motorola MX1 处理器是基于 ARM 架构的,所以我们需要创建基于 ARM 的交叉开发环境,进行 linux 嵌入式开发。...包括诸如 ar、as、objdump、objcopy 等实用程序。
WebAssembly(WIP)的objdump。 当前用法: antiwasm [args] --filename [file.wasm] 当前参数: --help :显示帮助。 --debug :调试模式。 --verbose :详细模式。 --pedantic : --pedantic模式
贝戈解析go tool objdump输出中的字节码。如何? make go tool compile -S -N file.go go tool objdump -S file.o | shellgo标志-dump <file> /将file_name.in和file_name.out分别stdout到stdin和stdout 。 -version...
ar-用于创建,修改和提取档案的实用程序。 c ++ filt-过滤以解编码编码的C ++符号。 dlltool-创建用于构建和使用DLL的文件。 gold-一个新的,更快的,仅ELF的链接器,仍处于beta测试中。 gprof-显示分析信息。 ...
由 objdump -d 或 -D 创建的 x86/x64 反汇编文件的 vim 语法