Linux ld命令使用方法
1. ld命令: linux链接器作用: 将一系列目标文件(.o)和静态库文件(.a)链接起来(动态库文件.so也可能作为ld的输入文件)
2. 常用选项注意:对于单字母的选项(如-l等),选项的参数直接跟在选项之后,用不用空格分隔都可以。
2.1 -l <namespec>或者--library=<namespec>使用<namespec>标识的库文件(动态库lib.so优先于静态库lib.a)。
如果<namespec>是:filename的形式,查找文件名为filename的库文件。
2.2 -L <searchdir>或者--library-path=<searchdir>添加一个查找库文件(和控制脚本)的目录<searchdir>以供-l选项使用,多个此选项之间的顺序关系为在命令行出现的顺序,最后为默认查找目录。
默认查找目录是系统依赖的,较为复杂,如/lib/x86_64-linux-gnu。
2.3 -rpath=<dir>添加<dir>到此次生 ...
Linux加载器、加载、动态链接器与动态链接
1. 别名和对应的文件别名包括:
动态链接器(dynamic linker),加载器(loader),动态加载器(dynamic loader),运行时链接器(run-time linker),ELF解释器(ELF interpreter),ld.so,ld-linux.so
上述这些描述的是同一件事,其对应的文件为:
ld.so,ld-linux.so,/lib/ld-linux.so.1,/lib/ld-linux.so.2,/lib64/ld-linux-x86-64.so.2
在现代linux机器上,一般使用的是/lib/ld-linux.so.2和/lib64/ld-linux-x86-64.so.2,用于处理ELF格式二进制文件
2. 动态链接器运行方式
间接运行: 通过运行一个动态链接的程序或者共享库,ELF文件会将动态链接器存放在.interp段中
直接运行: /lib/ld-linux.so.* [OPTIONS] [PROGRAM [ARGUM ...
Linux GDB反向执行
1. 应用场景反向执行(Reverse Execution)应用在:当发现执行太过了的时候,关注的问题可能已经发生了,需要反向执行。
需要目标环境支持,不是所有目标环境都可以实现反向执行的。
2. 程序执行的记录(record)和重放(replay)record会拖慢程序执行速度。
如果执行日志中包括下一条指令的执行记录,GDB会使用replay mode,此时运行程序不会真正执行代码,而是从执行日志中恢复程序状态。
否则如果执行日志中不包括下一条指令的执行记录,GDB会使用record mode,此时运行程序会正常执行,但GDB会记录执行日志以备将来replay。
即使程序运行的平台不支持Reverse Execution,在执行日志记录的范围内,GDB也可以通过replay支持Reverse Execution。
在反向执行时,如果执行日志包括先前指令的记录,GDB会使用replay mode,否则,如果平台支持反向执行,GDB会使用record mode,如果不支持则stop。
3. record和replay相关的命令3.1 record [METHOD]缩写为rec [MET ...
Linux GDB Watchpoint
1. 基本概念watchpoint又称data breakpoint,用于监控某个表达式,当它的值改变时stop程序。
表达式可以是单个变量,也可以包含操作符(任意原语言中有效的操作符)。
2. 分类2.1 software watchpointGDB单步执行程序,然后每次都计算表达式值。因此程序执行速度可能慢了数百倍,而且它在被监控值改变后的下一条语句处才报告值改变,而非在确切的CPU指令处。
2.2 hardware watchpoint依赖硬件支持(如x86架构),不会减慢程序执行速度,且在改变被监控值的CPU指令执行时即能及时报告。
GDB会尽可能创建hardware watchpoint。
有时GDB不能创建hardware watchpoint,可能的原因包括:
要监控的内存区域过大。(此时GDB可能把它拆分成多个小的hardware watchpoint)。
已经设置了太多hardware watchpoint。但可能到程序resume执行时(而不是创建watchpoint时)GDB才会报告”Hardware watchpoint : Could not insert ...
Linux GDB 多线程调试
1. All-Stop Mode这是GDB的默认模式(共两个模式,另一个为Non-Stop Mode)。
当一个线程stop时(比如因为hit断点),所有线程都stop。
类似地,当继续执行这个线程时(比如使用step或者next命令),所有其他线程也会恢复执行,但它们不受当前线程的step或者next命令控制而自由执行(因为线程调度依赖kernel,而不受GDB控制),因此可能执行任意条语句。而且当这些其他线程遇到断点时会导致GDB发生自动线程切换,此时原线程的step或者next命令甚至可能还没执行完。
1.1 锁住OS scheduler这是为了在恢复执行时只允许一个线程运行。
scheduler锁定模式有多种,使用命令set scheduler-locking <mode>设置,show scheduler-locking获取。
可用的模式有:
off 无锁定,任意线程可以任意运行。
on 只有当前线程可以运行,其他线程依然stop。
step 当单步执行时效果类似on,使用其他执行命令(如continue, until, finish)时类似off。(由于机 ...
Linux GDB Convenience Variables
1. 基本介绍
形式为以$开头的名字(以$开头的数字不是)
无固定类型,甚至可以是结构体或者数组
2. 赋值使用set命令,如set $foo = *object_ptr
3. 使用示例不断使用回车遍历数组:
12set $i = 0p arr[$i++]
Linux GDB TUI(Text User Interface)
1. GDB tui常用命令1.1 启动和退出tui模式
分别是tui enable(缩写为tui e)和tui disable(缩写为tui d)命令
或者使用快捷键ctrl+x+a,按第一次进入,第二次退出
1.2 ctrl+L 刷新屏幕在程序使用标准输出和标准错误打印时屏幕可能乱掉,可以使用ctrl+L进行刷新
ctrl+L不会被记在命令历史里,下一次ENTER不会重复ctrl+L
1.3 info win命令列出当前显示的所有窗口
1.4 focus命令缩写为fs,改变焦点到不同窗口,使用方式focus [WINDOW-NAME | next | prev]
1.5 查看文档使用help text-user-interface查看tui相关所有命令
2. CGDBCGDB是GDB的一个控制台前端(Console Frontend),它还是使用GDB进行实际调试
GDB的tui模式不支持源码窗口和命令窗口垂直分屏,因此使用CGDB
2.1 使用1. 启动在shell中输入cgdb启动程序
调用方式类似GDB:
1cgdb [cgdb options] [--] [gdb ...
过邺下吊高神武
过邺下吊高神武
[清] 袁枚
唱罢阴山敕勒歌,英雄涕泪老来多。
生持魏武朝天笏,死授条侯杀贼戈。
六镇华夷传露布,九龙风雨聚漳河。
祇今尚有清流月,曾照高王万马过。
Linux查看二进制文件内容
1. 命令1hexdump -C <file>
或者
1hd <file>
hd是hexdump的符号链接
临江仙·夜归临皋
临江仙·夜归临皋
[宋] 苏轼
夜饮东坡醒复醉,归来仿佛三更。家童鼻息已雷鸣。敲门都不应,倚杖听江声。
长恨此身非我有,何时忘却营营。夜阑风静縠纹平。小舟从此逝,江海寄余生。
