Binutils 相关工具记录
Binuitils 介绍
The GNU Binutils are a collection of binary tools. The main ones are:
ld
- the GNU linkeras
- the GNU assemblergold
- 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
的相关内容。
ldconfig
是管理共享库的基本工具。较为正式的共享库形式为lib<name>.so.主版本号.次版本号.发布版本号
,而能够保持基本兼容性的形式为lib<name>.so.X
,两者通过软链接关联,该形式称为SO-NAME
,一般应用程序中.dymanic
节中对共享库依赖的声明也为为其SO-NAME
。一般情况下,在生成lib<name>.so.X.Y.Z
后并拷贝到库目录后,调用sudo ldconfig
就能更新SO-NAME
。(以前手动搞的确挺笨)- 影响
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
其中动态链接器ld
和libc
是典型的:
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 相关工具记录相关推荐
- 【keepass】密码管理软件-推荐插件和相关工具合集-keepass工作流分析(自动填充、美化界面、快速添加记录、安全增强、软件和数据库维护类)
Keepass有很多已经开源的插件,生态良好,在官网有专门的插件推荐区.安装插件的方法很简单,直接把下载好的插件文件放在plugins文件夹内,重启软件即可.下面我以几大功能推荐一些keepass插件 ...
- Android 农历和节气相关工具类(记录)
中国农历相关的工具类,可以获取当前或者规定日期的农历,节气,生肖等. LunarCalender.java package com.zhou.ghost.utils;import java.text. ...
- Linux-X86和Linux-ARM编译binutils
工程开发中需要用到binutils里面相关工具,例如库和进程分析工具的nm.addr2line等,某些环境下可能没有这些工具,于是需要自己安装,这里记录一下安装过程,详细讲解了Linux-X86和Li ...
- 【Buildroot】学习记录(2)配置注释
文章目录 一.前言 二.Buildroot目录结构 三.Buildroot配置选项 四.Target options(目标选项) 五.Build options(编译选项) 六.Toolchain(工 ...
- 华为NPU卡ubuntu(无网络连接情况)驱动安装记录
华为NPU卡ubuntu驱动安装记录 前奏:文中的绝大多数情况都是因为服务器没有网络服务,如果读者的电脑有完全的网络服务可能参考意义不是很大.不过,处理的方法和排查的思路可以作为一个借鉴. root@ ...
- Linux下服务器端开发流程及相关工具介绍(C++)
原文:Linux下服务器端开发流程及相关工具介绍(C++) 去年刚毕业来公司后,做为新人,发现很多东西都没有文档,各种工具和地址都是口口相传的,而且很多时候都是不知道有哪些工具可以使用,所以当时就想把 ...
- Binutils工具集 GCC工具集介绍
GNU Binutils详解:http://www.crifan.com/files/doc/docbook/binutils_intro/release/html/binutils_intro.ht ...
- 我学shell程序的记录
1. 将当前目录下的文件去除后缀名".sh" for i in `ls .` do mv -v $i `echo ${i%%.sh}` done 2.shell中在列文件 ...
- Linux二进制实用工具Binutils工具集解析()
From:http://blog.csdn.net/zqixiao_09/article/details/50783007 GNU Binutils:http://www.gnu.org/softwa ...
最新文章
- php中public放什么,PHP中常用关键字public, private, protected, static...
- IIS发布ASP.NET应用常见错误及解决办法
- 函数指针和函数指针数组及其应用
- 001_SpringBoot入门
- edp 基于node.js和npm的前端开发平台
- [原创软件]体验组批量加分工具
- 3 天撸了个数据中台出来,我飘了~
- Entity Framework 相关知识点合集
- Linux 离线安装 docker-componse,防止网络出现问题
- python读取多个文件夹_Python:从文件夹中读取多个json文件
- xutils使用流程
- PHP地图规划骑行路径,骑行路线规划-路线规划-开发指南-iOS 导航SDK | 高德地图API...
- Skiing POJ 3037 很奇怪的最短路问题
- n9 android rom,美如画N9盒子线刷固件rom升级包下载(全志H8芯片)
- 网页自动填表html,韶关网页自动填表基础教程从简单开始 - MutouSoft - 时间财富网...
- 音量控制 单片机c 语言,单片机可调音量一线控制语音芯片程序
- AWS Landing Zone Solution
- 如何给屏幕设置一个充满全屏幕的背景图片
- C. Minimum Ties (构造)
- 成都拓嘉辰丰:拼多多一件代发的产品退货怎么做?