0%

使用 objdump objcopy 查看修改符号表

  • objdump 查看 ELF 文件内容
  • objcopy 转换 ELF 文件格式

objdump

查看依赖项

  1. ldd
    $ ldd exuberant-ctags.so
     linux-vdso.so.1 (0x00007ffc849e6000)
     libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f28eea31000)
     /lib64/ld-linux-x86-64.so.2 (0x00007f28ef025000)
  2. objdump
    $ objdump -x exuberant-ctags.so | grep "NEEDED"
    NEEDED               libc.so.6

查看动态符号表

$ objdump -T exuberant-ctags.so

查看所有符号

$ objdump -t exuberant-ctags.so

objcopy

Example

假如我们有个静态库,想做这么几个事儿:把一个函数作用域从全局修改为本地、把一个函数作用域从本地修改为全局、把一个函数的名字修改一下。那么步骤如下:

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 //打包为静态库

Ref

  1. Linux命令学习手册-objcopy命令