查看so库的方法__臣本布衣_新浪博客 (sina.com.cn)
1、nm -D libxxx.so 打印出符号信息。
一般这样用:nm -D libxxx.so |grep T
$ nm -D /lib/libstdc++.so | grep T
0000000000000618 T _fini
00000000000004e0 T _init
w _ITM_deregisterTMCloneTable
w _ITM_registerTMCloneTable
2、ldd libxxx.so 查看依赖关系
$ ldd /lib/libstdc++.so
ldd: warning: you do not have execution permission for `/lib/libstdc++.so'
linux-vdso.so.1 => (0x00007fff029fc000)
libc.so.6 => /lib64/libc.so.6 (0x00007f6523e82000)
/lib64/ld-linux-x86-64.so.2 (0x00007f6524452000)
3、readelf -a libxxxx.so 用来读取elf信息
一般这样用:readelf libxxx.so |grep NEEDED 这样也可以读取依赖关系
$ readelf -a /lib/libstdc++.so | grep NEEDED
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
5、objdump -d libxxxx.so
6、file libxxx.so 这样可以查看so库的属性
$ file /lib/libstdc++.so
/lib/libstdc++.so: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, BuildID[sha1]=d098ee7c7e519e2c4311869633523aae4f805c17, not stripped
2 查看可执行程序
参考博客:linux下查看so或可执行程序的依赖库_Linux_脚本之家 (jb51.net)
1、查看可执行程序依赖的库
$ readelf -a test | grep NEEDED
0x0000000000000001 (NEEDED) Shared library: [libpthread.so.0]
0x0000000000000001 (NEEDED) Shared library: [libm.so.6]
0x0000000000000001 (NEEDED) Shared library: [libc.so.6]
2、查看各个段大小
$ size test
text data bss dec hex filename
49052 1500 320 50872 c6b8 test
3 查看代码分区
参考博客:.bss,.data,.text,.rodata - 水中有泪 - 自由互联 (cnblogs.com)
系统根据文件生成区块(section)会区分存储特性:
查看命令:objdump -h xx.o
(1)特性种类:
(2)属性
(3)归类
BSS :主要存放0或者无初始值的全局变量和0或者无初始值的静态局部变量
Data:主要存放初始值是0以外的全局变量和初始值为0以外的静态局部变量
Text:机械语跟代码
Rodata:字符串,或者定数(const)
4 内核打印参考博客:https://www.cnblogs.com/Caden-liu8888/p/5652168.html
1、查看当前控制台的打印级别
$ cat /proc/sys/kernel/printk
4 4 1 7
其中第一个“4”表示内核打印函数printk的打印级别,只有级别比他高的信息才能在控制台上打印出来,既 0-3级别的信息
2、修改打印等级
echo "新的打印级别 4 1 7" >/proc/sys/kernel/printk
printk的打印级别
不够打印级别的信息会被写到日志中可通过dmesg 命令来查看
3、printk函数的使用
printk(打印级别 “要打印的信息”)
打印级别 既上面定义的几个宏
4、打印日志会存放在/proc/kmsg中,这是一个进程,可以一直读取它来进行实时打印。
tail -n 10 -f /proc/kmsg
5 KO调试
参考博客:(19条消息) linux调试ko - CSDN
(1)去除符号表
strip --strip-debug [需要处理的文件]
$ strip --strip-debug test
(2)把debug信息加回去
objcopy --add-gnu-debuglink=[debug文件] [需要添加debug信息的文件]
(3)将test的调试信息保存到 test.debug文件中,需要的时候装入就可。
$ objcopy --only-keep-debug test test.debug
$ gdb ./test
(gdb) l
No symbol table is loaded. Use the "file" command.
(gdb) file diag_shell.debug
(gdb) l
16 int32_t main(int argc, char *argv[])