1.1 gdb
1) info registers : 显示所有寄存器的值
2 )print : 打印特定寄存器
(gdb) p $edi
print/d 显示 10进制
print/t 显示 2进制
print/x 显示 16进制
3) x 显示特定内存的位置 值
x/ABC
A : 个数
B : c 字符 d 同上
C : b 字节 ; h 字 ;w ;双字
(gdb) x/16cb &mystr
4) 从开始点
(gdb) b *_start
1.2 as
命令 as -o xxx.o xxx.s
as -o xxx.o -gstabs xxx.s 为了可以gdb
1.3 ld
命令 ld -o main main.o
如果需要系统调用 加上 运行时加载动态库的程序
ld -dynamic-linker /lib/ld-linux.so.2 -o main -lc main.o
写道
这里带出点东西
使用原始系统调用好处
创建长度尽可能短的代码,执行最可能快的代码
因为他不需要把外部库链入 (不要加载动态加载程序)
C库 呢 移植 ,可共享,但是我清楚的记得 很多系统调用没有C库接口
或许你可以说他 can not be portable
当然以上所有的等同于 gcc -o main xxx.s
1.4 objdump -D main
1.5 strace
strace -c xxx
会列出一些 errors
strace -e trace = xxx,xxx
或者 直接 strace -p pid
二 架子
2.1 数据段
.data .rodata(read only)
2.1.1 标签:
.ascii 文本; .asciz 带空字符结尾的文本 ; .long .int ....
mystr:(相当于指针)
.ascii "Hello world"
2.1.2 静态符号(数据段)
output:
.ascii "szx start\n"
output_end:
.equ len , output_end - output
.equ MYNAGE ,22
cmp $MYAGE, %eax
2.2 bss段
.comm 声明初始化的数据的通用内存区域
.lcomm 声明未初始化的数据的本地内存区域 (不能用在globl命令)
.seciont .bss
.lcomm buffer ,10
好处是不会让你编译后的文件包括你开的bss空间. 上图可能只是一个符号
一般查找PC指针出错的方法是 (如果gdb where 只能看到出错的register 和pc )
1 如果有ld 链接文件,那么直接分析文件 比如android 里面就有很多 .map的 链接映射文件 规定了代码段 库等分布
(这个以后会专门写一篇)
如果没有也可以 通过/proc/pidxxx/men 来查看具体的分布
2 这时候找到.so 或者数据段的基址 然后去根据 -g 编译出来的文件 反编译汇编 找到PC出错的行 ,一般就可以分析出原因了(以后会补个列子)
==================================
linux 系统中 分配给程序运行的虚拟地址从
0x80480000 开始
使用 objdump -x 可执行 .可以获得内存布局 (readelf -e 或许更好 ^^)
写道
08048134 l d .interp 00000000 .interp
08048148 l d .note.ABI-tag 00000000 .note.ABI-tag
08048168 l d .note.gnu.build-id 00000000 .note.gnu.build-id
0804818c l d .gnu.hash 00000000 .gnu.hash
080481ac l d .dynsym 00000000 .dynsym
0804820c l d .dynstr 00000000 .dynstr
0804825e l d .gnu.version 00000000 .gnu.version
0804826c l d .gnu.version_r 00000000 .gnu.version_r
0804828c l d .rel.dyn 00000000 .rel.dyn
08048294 l d .rel.plt 00000000 .rel.plt
080482b4 l d .init 00000000 .init
080482e4 l d .plt 00000000 .plt
08048340 l d .text 00000000 .text
080484ec l d .sched.text 00000000 .sched.text
08048500 l d .fini 00000000 .fini
0804851c l d .rodata 00000000 .rodata
08048548 l d .eh_frame 00000000 .eh_frame
08049f0c l d .ctors 00000000 .ctors
08049f18 l d .dtors 00000000 .dtors
08049f24 l d .jcr 00000000 .jcr
08049f28 l d .dynamic 00000000 .dynamic
08049ff0 l d .got 00000000 .got
08049ff4 l d .got.plt 00000000 .got.plt
0804a010 l d .data 00000000 .data
0804a018 l d .bss 00000000 .bss
其实.init .sched.text 在kernel 中可以看到进常通过gcc 特性用
#define __sched __attribute__((__section__(".sched.text")))
来指定
如果你 gdb where
发现都是一排 十六进制地址 没有任何源码信息 不要慌着
记得加上-g 编译后 用 objdump -D 翻译成 汇编 ,
然后去找这些地址 , 当然你需要知道一些C 风格的汇编 格式(入stack 局部变量保存 等)
==========================
有时候如果你没有nm 或者ldd 来看系统当前连接的动态库, 何不直接vi 可执行文件,然后 /???.so 这样看
屡试不爽哦
当然也可以直接 readelf .....
http://www.cnblogs.com/napoleon_liu/archive/2011/05/06/2038698.html
- 大小: 56.6 KB
分享到:
相关推荐
<artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </...
<groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.12</version> </dependency> </dependencies> ``` ### 4. Maven 构建生命周期 Maven 提供了三个主要的生命周期...
### 基于Linux的C语言常用开发工具及应用 #### 一、引言 随着计算机技术的发展,C语言作为一门强大的编程语言,在计算机科学领域占据着举足轻重的地位。传统的C语言教学多依赖于Windows平台,但由于知识产权等问题...
### Linux编译工具使用知识点详解 #### 一、编译器概述 - **11.1 编译器** - **11.1.1 功能及用法** - **为什么要使用编译器?** - C语言源程序需要经过**编译**和**链接**两个过程才能转换成二进制可执行程序...
GDB(GNU Debugger)是常用的C语言调试工具,通过`-g`编译选项生成调试信息,便于在GDB中设置断点、单步执行、查看变量值等。 **6. 库文件的使用与创建** 库文件分为静态库(.a)和动态库(.so)。在编译时,使用`-...
- **Linux环境设置**:指导读者如何在Linux环境下搭建汇编语言开发环境,包括安装必要的软件工具。 - **系统调用**:介绍如何使用Linux系统调用来实现文件操作、进程管理等功能。 - **高级主题**:探讨更高级的主题...
《Assembly Language Step-by-Step: Programming with Linux》(第三版)是一本深入讲解汇编语言及其在Linux环境下的应用的专业书籍。本书由Jeff Duntemann编写,并于2009年由Wiley出版社出版。该书不仅适合初学者...
ML615是一款基于8086/8088微处理器的汇编器,它是初学者学习16位x86汇编语言的常用工具。ML615提供了一个简单的命令行界面,用户可以在这个环境下编写、编译和链接汇编语言程序。它能够将汇编代码转换成机器码,使得...
### 《Assembly Language Step-by-Step: Programming with DOS and Linux, Second Edition》 #### 标题解析: 本书名为《Assembly Language Step-by-Step: Programming with DOS and Linux, Second Edition》,是一...
总之,汇编语言虽然不是日常开发中的常用工具,但对于想要深入了解计算机底层运作机制或者需要在特定场景下优化程序性能的开发者来说,仍然是一个不可或缺的技能。通过本文提供的指南,希望读者能够更好地掌握和应用...
在Linux下,常用的汇编器有`nasm`、`gas`等,链接器如`ld`用于将目标文件链接成可执行文件。此外,`gdb`作为调试工具,帮助开发者追踪程序运行过程,理解代码执行细节。 ### 三、本书核心内容解析 #### 第一部分:...
### Linux下ARM汇编语法详解 #### 一、引言 在嵌入式系统和低级别编程领域,...以上是Linux下ARM汇编语法的基础内容及常用工具介绍,对于希望深入学习嵌入式系统和底层编程的开发者来说,掌握这些基础知识至关重要。
- **开发环境搭建**:介绍如何在Linux系统中安装和配置必要的开发工具,如GCC、GDB等。 - **GCC(GNU Compiler Collection)**:GCC是GNU项目的一部分,用于编译C、C++以及汇编语言等源代码。在本书中,读者将学习...
Linux GCC常用命令涵盖了GCC(GNU Compiler Collection)编译器的使用方法,它是编写和运行C、C++等语言程序的重要工具。GCC最初仅支持C语言编译,但随着发展,它已演化为一个强大的编译器集合,支持多种编程语言,...
- **开发工具**:在Linux环境下进行汇编语言编程通常会用到以下几种工具: - **文本编辑器**:如vi、nano等,用于编写汇编源代码。 - **汇编器**:如nasm、gas等,负责将汇编语言翻译成机器语言。 - **链接器**:...
### Linux GCC常用命令知识点详解 #### 一、GCC概述 GCC (GNU Compiler Collection) 是一套由 GNU 开发的编译工具集,最初是为了支持 C 语言的编译工作而设计的。随着时间的发展,GCC 已经扩展支持了多种编程语言,...
在Linux操作系统环境中,汇编语言是理解底层系统运作机制的关键工具之一。本教程旨在为读者提供一个全面深入的学习指南,帮助理解Linux内核以及在Linux环境下编写驱动程序的方法。 #### 二、关于作者与出版信息 ...
#include <stdio.h> int main(void) { printf("Hello World!\n"); return 0; } ``` 编译这个程序的命令是`gcc test.c -o test`。这个过程实际上包含了四个阶段: 1. **预处理(Preprocessing)**: 使用`-E`选项,...