Binuitils 介绍

The GNU Binutils are a collection of binary tools. The main ones are:

  • ld - the GNU linker
  • as - the GNU assembler
  • gold - a new, faster, ELF only linker

But they also include

bin discription
addr2line Converts address into filenames and line numbers
ar A utility for creating, modifying and extracting from archives
c++filt Filter to demangle encoded C++ symbols
dlltools Creates files for building and using DLLs
elfedit Allows alteration of ELF format files
gprof Displays profiling information
gprofng Collects and displays application performance data
nlmconv Convert object code into an NLM
nm Lists symbols from object files
objcopy Copies and translates object files
objdump Displays information from object files
ranlib Generates an index to contents of an archieve
readelf Displays information from any ELF format object file
size Lists the section sizes of an object or archive file
strings Lists printable strings from files
strip Discards symbols
windmc A Windows compatible message compiler
windres A compiler for Windows resource files

以上摘录自GNU官方网站。此外,/usr/inlcude/elf.h文件也是一个参考。下面是一些个人的记录。

Binutils 使用简记

链接器ld(1) 和 动态链接器ld-liunx(8)的小结

链接器ld是编译系统的最后一环,能够编译出目标文件.o或共享文件.so,基本等同于静态库文件lib<name>.a和共享库文件lib<name>.so.X.Y.Z。平常使用的基本形式为:

ld [-static] [-L library_path] [-l library_name] [-soname...] [*.so] [*.o] -o <output>

动态链接器/lib[64]/ld-linux.so.*是用来处理程序装载时的共享库文件,代替e_entry作为依赖共享库的程序的入口点,并完成自身共享库依赖的装载、符号解析工作。该文件也可以直接运行,形式上为:

/lib64/ld-linux.so.*  [OPTIONS] [PROGRAM [ARGUMENTS]]

鉴于现在的默认编译方式为动态链接,有必要了解一下ld-linux的相关内容。

  1. ldconfig是管理共享库的基本工具。较为正式的共享库形式为lib<name>.so.主版本号.次版本号.发布版本号,而能够保持基本兼容性的形式为lib<name>.so.X,两者通过软链接关联,该形式称为SO-NAME,一般应用程序中.dymanic节中对共享库依赖的声明也为为其SO-NAME。一般情况下,在生成lib<name>.so.X.Y.Z后并拷贝到库目录后,调用sudo ldconfig就能更新SO-NAME。(以前手动搞的确挺笨)
  2. 影响ld-linux的一些环境变量,更多的参考手册。
    • LD_LIBRARY_PATH,对ld也有影响
    • LD_PRELOAD强制提前装载的共享库,可以覆盖某些符号,例如printf
    • LD_DEBUG可以使ld-linux打印装载信息

使用C++filt处理name mangling

C++ 的Name mangling虽然规则明确,但形式比较复杂。

c++filt _ZN9wikipedia7article6formatE
> wikipedia::article::format

不同编译器的 mangle 方式可能不同,这里需要注意适用范围。

nm查看符号表(.symtab)

nm hello.o
>                  U _GLOBAL_OFFSET_TABLE_
> 0000000000000000 T main
>                  U puts

默认包括符号值、符号类型、符号名三栏

objdump/readelf

两者的功能有较大的重叠,不过objdump也能够做dissamble、read raw bits。但两者的主要功能还是解析ELF文件的各个section的信息,主要包括elf header、section header table、section header string table、symbol table,以及.text、.data、.rodata等段。该部分与ELF文件格式紧密相关,可以参考《程序员的自我修养:链接、装载与库》第3章。

ar 查看archive的目标文件

ar -t /usr/lib/x86_64-linux-gnu/libc.a
>>>
init-first.o
libc-start.o
sysdep.o
version.o
check_fds.o
libc-tls.o
elf-init.o
dso_handle.o
errno.o
errno-loc.o
...

其他相关工具

ldd (1) : list shared object dependencies

ldd /bin/bash
>>>
linux-vdso.so.1 (0x00007ffdb6c72000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007f4c3d5b0000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f4c3d5aa000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f4c3d3b8000)
/lib64/ld-linux-x86-64.so.2 (0x00007f4c3d722000

其中动态链接器ldlibc是典型的:

libc implements both standard C functions like strcpy() and POSIX functions (which may be system calls) like getpid()

libdl则是运行时用于加载动态库的库(以上的依赖是装载时的动态库依赖)。而liunx-vsdo实际并不是文件,其描述man 7 vsdo

The “vDSO” (virtual dynamic shared object) is a small shared
library that the kernel automatically maps into the address space
of all user-space applications.

一般也不需过于关心。

参考内容

  • 俞甲子等《程序员的自我修养:链接、装载与库》

Binutils 相关工具记录相关推荐

  1. 【keepass】密码管理软件-推荐插件和相关工具合集-keepass工作流分析(自动填充、美化界面、快速添加记录、安全增强、软件和数据库维护类)

    Keepass有很多已经开源的插件,生态良好,在官网有专门的插件推荐区.安装插件的方法很简单,直接把下载好的插件文件放在plugins文件夹内,重启软件即可.下面我以几大功能推荐一些keepass插件 ...

  2. Android 农历和节气相关工具类(记录)

    中国农历相关的工具类,可以获取当前或者规定日期的农历,节气,生肖等. LunarCalender.java package com.zhou.ghost.utils;import java.text. ...

  3. Linux-X86和Linux-ARM编译binutils

    工程开发中需要用到binutils里面相关工具,例如库和进程分析工具的nm.addr2line等,某些环境下可能没有这些工具,于是需要自己安装,这里记录一下安装过程,详细讲解了Linux-X86和Li ...

  4. 【Buildroot】学习记录(2)配置注释

    文章目录 一.前言 二.Buildroot目录结构 三.Buildroot配置选项 四.Target options(目标选项) 五.Build options(编译选项) 六.Toolchain(工 ...

  5. 华为NPU卡ubuntu(无网络连接情况)驱动安装记录

    华为NPU卡ubuntu驱动安装记录 前奏:文中的绝大多数情况都是因为服务器没有网络服务,如果读者的电脑有完全的网络服务可能参考意义不是很大.不过,处理的方法和排查的思路可以作为一个借鉴. root@ ...

  6. Linux下服务器端开发流程及相关工具介绍(C++)

    原文:Linux下服务器端开发流程及相关工具介绍(C++) 去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把 ...

  7. Binutils工具集 GCC工具集介绍

    GNU Binutils详解:http://www.crifan.com/files/doc/docbook/binutils_intro/release/html/binutils_intro.ht ...

  8. 我学shell程序的记录

    1. 将当前目录下的文件去除后缀名".sh" for i in `ls .`  do    mv -v $i `echo ${i%%.sh}`  done 2.shell中在列文件 ...

  9. Linux二进制实用工具Binutils工具集解析()

    From:http://blog.csdn.net/zqixiao_09/article/details/50783007 GNU Binutils:http://www.gnu.org/softwa ...

最新文章

  1. php中public放什么,PHP中常用关键字public, private, protected, static...
  2. IIS发布ASP.NET应用常见错误及解决办法
  3. 函数指针和函数指针数组及其应用
  4. 001_SpringBoot入门
  5. edp 基于node.js和npm的前端开发平台
  6. [原创软件]体验组批量加分工具
  7. 3 天撸了个数据中台出来,我飘了~
  8. Entity Framework 相关知识点合集
  9. Linux 离线安装 docker-componse,防止网络出现问题
  10. python读取多个文件夹_Python:从文件夹中读取多个json文件
  11. xutils使用流程
  12. PHP地图规划骑行路径,骑行路线规划-路线规划-开发指南-iOS 导航SDK | 高德地图API...
  13. Skiing POJ 3037 很奇怪的最短路问题
  14. n9 android rom,美如画N9盒子线刷固件rom升级包下载(全志H8芯片)
  15. 网页自动填表html,韶关网页自动填表基础教程从简单开始 - MutouSoft - 时间财富网...
  16. 音量控制 单片机c 语言,单片机可调音量一线控制语音芯片程序
  17. AWS Landing Zone Solution
  18. 如何给屏幕设置一个充满全屏幕的背景图片
  19. C. Minimum Ties (构造)
  20. 成都拓嘉辰丰:拼多多一件代发的产品退货怎么做?

热门文章

  1. 查看从机状态 mysql_mysql常用操作命令
  2. JMeter开发一个最简单的Sampler
  3. 2020新款真无线蓝牙耳机盘点,双11高性价比十款蓝牙耳机推荐
  4. CAD基础+常用快捷(三)
  5. 【CV】ViT:用于大规模图像识别的 Transformer
  6. 三维欧几里德空间中两个向量叉积的问题
  7. 联合索引,组合索引,详细应用实例
  8. c++ Numeric limits
  9. 【转】智力题解答汇总
  10. (转)认识动作捕捉系统 浅谈三种主流解决方案