首页  

Linux可执行文件信息查看     所属分类 linux 浏览量 820
gcc -o hello hello.c
gcc -g -o hello_debug hello.c



可执行文件信息查看
readelf ldd nm file strip size strings objdump


readelf查看可执行文件头信息
readelf -h hello

Class   位数
Data    大小端信息
Machine 运行平台

readelf -x .rodata  hello
 
ldd 查看程序依赖的动态库
ldd hello

nm 符号表信息
nm hello

file 查看文件信息
file hello
hello: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=132ce1a61a995c67e14bbdd61583bea0225738f2, not stripped
not stripped 表示含有符号表
线上程序可能会选择去掉符号表信息,可减小文件大小

size查看可执行文件大小
size hello
   text	   data	    bss	    dec	    hex	filename
   1188	    540	      4	   1732	    6c4	hello
   
data占用过大,可能是程序中用到了太多的 全局变量 静态变量 或 常量



去掉符号表 
strip hello
执行前 文件大小 8480
执行后 文件大小 6344
file hello   最后 显示 stripped

strings查看可执行文件中的字符串
strings hello
 
objdump反汇编
objdump  -d hello_debug
objdump -S  -d hello_debug
-S 显示 源码


反汇编特定函数(如main函数)

先按照地址顺序输出符号表信息
nm -n hello |grep main -A 2
                 U __libc_start_main@@GLIBC_2.2.5
                 U puts@@GLIBC_2.2.5
00000000004003c8 T _init
--
000000000040051d T main
0000000000400540 T __libc_csu_init
00000000004005b0 T __libc_csu_fini

main的开始地址为0x000000000040051d,结束地址为0x0000000000400540

反汇编main函数
objdump -d hello --start-address=0x000000000040051d --stop-address=0x0000000000400540

上一篇     下一篇
编译时指定宏参数

systemctl service chkconfig 之间的关系

Java实现简单的模板

C语言获取时间戳秒

C语言获取时间戳秒毫秒微秒

java 和 C 循环和递归性能比较