1 查看SO

查看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)特性种类:

种类 说明
SHT_NULL 无效的区块
SHT_PROGBITS 带有数据(机械语和初始值等)的区块
SHT_NOBITS 不带有数据
SHT_RELA 带有可再分配的数据(不依赖与内存的代码)的区块
SHT_REL
SHT_SYMTAB 带有符号表的区块

(2)属性

属性 说明
SHF_ALLOC 应该放在内存上的区块
SHF_WRITE 应该放在可读写区域的区块
SHF_EXECINSTR 应该放在可执行区域的区块

(3)归类

文件 种类 属性
.bbs SHT_NOBITS SHF_ALLOC + SHF_WRITE
.data SHT_PROGBITS SHF_ALLOC + SHF_WRITE
.text SHT_PROGBITS SHF_ALLOC + SHF_EXECINSTR
.rodata SHT_PROGBITS SHF_ALLOC

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的打印级别

打印等级 说明
#define KERN_EMERG "<0>" /* system is unusable */
#define KERN_ALERT "<1>" /* action must be taken immediately */
#define KERN_CRIT "<2>" /* critical conditions */
#define KERN_ERR "<3>" /* error conditions */
#define KERN_WARNING "<4>" /* warning conditions */
#define KERN_NOTICE "<5>" /* normal but significant condition */
#define KERN_INFO "<6>" /* informational */
#define KERN_DEBUG "<7>" /* debug-level messages */

不够打印级别的信息会被写到日志中可通过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[])

查看SO KO 执行程序相关信息命令的更多相关文章

  1. 查看Java JVM参数配置信息命令

    查看Java JVM参数配置信息命令 java -XX:+PrintCommandLineFlags jvm运行时状态的参数,可以很快找出问题所在.现在把几个命令记录一下:1. jstat这个命令对于 ...

  2. 查看cpu核的相关信息

    查看CPU信息(型号) cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c 80 Intel(R) Xeon(R) CPU E7-4820 v3 ...

  3. CentOS查看显卡及GPU相关信息

    lspci  | grep -i vga 这样就可以显示机器上的显卡信息,比如 [root@localhost conf]# lspci | grep -i vga01:00.0 VGA compat ...

  4. 怎样在 Linux 上查看某个端口的相关信息?

    比如 TCP端口 / UDP端口 / 端口占用程序的进程号 等, 这些信息都可以使用: netstat -atunlp | grep 端口号 来进行获取. 比如我们想获取 22 端口的相关信息: 这里 ...

  5. Linux命令 uname:查看系统与内核相关信息

    zh@zh:~$uname --help zh@zh:~$uname -a //所有系统相关的信息

  6. linux 查看cpu相关信息命令

  7. 查看linux系统版本相关信息

    1.查看内核版本:cat /proc/version A机器 root@debian:~# cat /proc/version Linux version -- (ty@debian) ( (Debi ...

  8. 性能测试必备知识(2)- 查看 Linux 的 CPU 相关信息

    做性能测试的必备知识系列,可以看下面链接的文章哦 https://www.cnblogs.com/poloyy/category/1806772.html 查看系统 CPU 信息 cat /proc/ ...

  9. Linux使用storcli工具查看服务器硬盘和raid组信息

    1.简介 MegaCli 是LSI公司官方提供的SCSI卡管理工具,由于LSI被收购变成了现在的Broadcom,所以现在想下载MegaCli, 需要去Broadcom官网查找Legacy产品支持,搜 ...

  10. MySQL查看数据库相关信息

    使用MySQL时,需要了解当前数据库的情况,例如当前的数据库大小.字符集.用户等等.下面总结了一些查看数据库相关信息的命令   1:查看显示所有数据库 mysql> show databases ...

随机推荐

  1. Windows家庭版开启远程桌面的方法

    一.背景介绍 Windows家庭版提示不支持远程桌面,如下图Windows11家庭版: 本文将介绍一种Windows家庭版开启远程桌面的方法,分为开启远程桌面设置.配置问题排查及解决: 安装远程桌面补 ...

  2. Redis基础(一)——字符串、hash类型的基本使用

    day09--Redis Redis介绍和安装 # Redis:软件,存储数据的,速度非常快,Redis是一个key-value存储系统(没有表的概念),cs架构的软件 服务端 客户端(python作 ...

  3. 什么是token,为什么需要token

    1.为什么需要token 随着互联网的发展,为了更安全,以及更好的用户体验,逐渐产生了token这个技术方案 之所以使用token是因为http/https协议本身是无状态的,不能进行信息的存储 (c ...

  4. 【Oracle】year must be between -4713 and +9999,and not be 0

    [Oracle]year must be between -4713 and +9999,and not be 0 year must be between -4713 and +9999,and n ...

  5. 一个开发者自述:我是如何设计针对冷热读写场景的 RocketMQ 存储系统

    简介: 文章中的很多知识点,都是通过云原生编程挑战赛学到的,在一些问题在表述方式.甚至理解上都可能存在一些问题,甚至会有一些谬论:敢于尝试就会犯错,有犯错才会有成长,欢迎各位大佬不舍赐教,多多指正,让 ...

  6. bilibili 实时平台的架构与实践

    摘要:本文由 bilibili 大数据实时平台负责人郑志升分享,基于对 bilibili 实时计算的痛点分析,详细介绍了 bilibili Saber 实时计算平台架构与实践.本次分享主要围绕以下四个 ...

  7. [FAQ] Win10 键盘输入的数字英文字体变宽, 胖英文, 如何处理

    输入法 点击右键,找到设置,点击进入. 开启 "全/半角切换" 快捷键为 "Shift + 空格",随后可以使用这个快捷键进行切换正常. Link:https: ...

  8. [Go] gorm 返回指定模型数据的处理方式

    重新 var 声明一个变量,类型为包含指定字段的结构体. 查询的时候,还是使用原始模型类型的变量. example: // For return data var retMember struct { ...

  9. [Blockchain] 前后端完全去中心化的思路, IPFS 与 Ethereum Contract

    我们在使用智能合约的时候,一般是把它当成去中心.减少信任依赖的后端存在. 如果没有特殊后端功能要求,一个 DApp 只需要前端驱动 web3js 就可以实现了. 可以看到,现在前端部分依旧是一个中心化 ...

  10. dotnetCampus.UITest.WPF 一个支持中文用例的界面单元测试框架

    本文来安利大家一个支持使用中文做用例名的 WPF 界面 UI 单元测试框架 卖点 有没有觉得命名太难?有没有觉得单元测试的命名更难?没错,这是一个业界的大问题.很多团队都会因为单元测试的用例函数命名太 ...