01- 复习

tar tvf xxx 查看压缩包内容

区分前后台: 是否能和用户交互

Vmware选桥接模式 会给系统虚拟一个和外部相同网段的ip

02- vim扩展操作

因为不是做嵌入式开发的 所以这些东西不是特别重要

简单过一遍

缩进:

右缩进 两个>>

左缩进 两个<<

4行右缩进  4>>

想把m变量改成n:

15,17s /f/m/g

r替换当前字符

R 替换当前光标后的字符

[d 查看宏:

(这个宏是在上面定义的)

在程序中使用man page:

光标移动到函数身上按K

示例:

这里应该按 3K 查看函数手册页面

在vim里执行shell命令:

!ls(在末行模式下)

:!ls

:!cp

:!man

例如: :!man 2 read

分屏操作:

比如我经常在文档开头和文档结尾处编辑 这个时候可以借助分屏

ctrl+ww

:sp 分屏 (末行模式)

ctrl +w  w

:vsp 竖分屏

ctrl +w  hjkl 选择性的切换分屏

:wqall 将所有窗口一次性退出

分屏打开另外的文件

:vsp aaa.h

配置文件:

/etc/vim/vimrc

这个配置文件配置的是整个操作系统 对所有用户生效

~/.vimrc 默认是一个隐藏文件

… …(如果想设置 自己百度)

(把vim打造成很强的ide)

03- gcc编译工具和工具链

-I 指定头文件的位置:

hello.c

hello.h

mv hello.h ..

gcc hello.c –I ..

这样就能编译成功了

-c只编译 不进行链接

最耗时的操作是编译

因为编译要一行一行的去检查语法错误

预处理和汇编都不会检查错误

汇编只是简单的翻译

-g 先不讲 后面讲gdb开发再讲

-On 驱动开发才经常会用

翻译成汇编的时候会直接删除这段代码

这段代码指定优化会把中间的没用步骤优化掉

-Wall ( warning all 提示完整的警告信息)

例如:

代码中加了一个不会被使用的变量

然后gcc hello.c –Wall

gcc本来就是一个工具链

GNU编译工具集合器

符号: 全局变量和函数

gcc hello.c

然后可以nm a.out

描述符T(表示在内存TEXT段内部已经实现的)

D 是在data段

U未实现

gcc –c hello.c

得到目标文件 hello.o

nm hello.o

目标文件比可执行文件 符号少很多

也就是说在最后一步链接的时候 会像目标文件里链入很多符号表

printf函数就未实现

printf函数是一个库函数

虽然有include <stdio.h>

但是 printf是在libc库里 libc库是一个动态库

动态库是在程序的运行期间链接

只有 ./a.out的时候 才会把printf跟程序链接到一块

nm 一下之前那个可执行文件 还是U 未实现

这个主要用于反汇编

例如:

objdump –dS hello.o

callq 调用函数

除了可以反汇编a.o

也可以反汇编a.out

ranlib 一般不用 太麻烦了

elf

file hello.o:

LSB 小尾端法存储 低地址存在低字节 高地址存在高字节

可重定位的

所以目标文件也叫 可重定位文件

file a.out:

可执行文件

目标文件和可执行文件都是二进制文件

即使是二进制文件也有属于它的存储格式 即elf格式

readelf命令就是读取这种格式的工具

readelf –a hello.o

大概包括三部分:

elf头 包括节头

重定位节:

符号表:

可执行程序装载到内存的原理

64bit系统内存太大了, 从32bit的示例

0~3G 是用户区

3G~4G 是kernal区

text:代码段 存放代码 int main void 什么的ascii码都翻译成二进制

data: 数据段 常量 字符串

bss: 未初始化的全局变量和未初始化的static变量

栈和堆重合的时候就内存溢出了

ro权限 (read only

rw权限

text段和data段之间有一个rodata

04-静态库

头文件只包含函数声明

真正的函数是在库文件里面

静态库libmytest.a

假如另外的b.out c.out d.out 每个都要添加一份

会复制一份作为程序代码的一部分

如果一个3m的静态库 有100个程序使用 内存中就会多出来300MB

main.c

add.c

mul.c

sub.c

可以制作成静态库函数

gcc main.c –o app –L ./ -l mymath –I ./

-L 指定库位置

-l 指定库的名字

-I 指定头文件位置

04- 动态库

动态链接器

当运行a.out的时候会使用动态连接器加载

运行b.out c.out d.out的时候 都会去加载这个stack和heap之间的动态库

共享代码(不共享数据)的意思是 如果a.out把共享库里一个变量改变了 b.out也会承受这个修改… … 所以一般动态数据库不会共享数据!  (了解)

动态链接器 链接器 除了名字像没任何关系

链接器工作在编译阶段

gcc 生成app的时候会用连接器

动态链接器是在程序运行的时候装载

生成可执行文件 然后运行 报错了

问题出在动态链接器不知道在哪找库

指定的方法:

01- 中午复习_动态库

符号: 全局变量 全局函数

函数名 变量名 都是地址值

静态库:编译时

动态库:运行时

Ldd 查看可执行文件执行期间要加载哪些库

这个东西就是动态链接器

动态链接器本质也是一个动态库

.bashrc

 

类似于vimrc 每次打开终端都会读取这个配置文件

 

export LD_LIBRARY_PATH = ./   (配置动态链接库目录)

 

这样配置完每次打开终端都生效

 

 

动态库的命名:

 

Realname: libc-2.19.so

 

这是一个软连接

 

Linkername : libc.so

 

 

Soname:

libc.so.6

6是大版本号

Soname的作用 :

当前是libc-2.19.so

 

官方进行更新后

可能变成libc-2.20.so

 

 

随着版本更新 版本更新的记录不想让用户知道

防止用户引起恐慌..

所以使用soname

 

Soname存在意义就是隐藏内部实现细节

 

 

静态库)

nm app:

Printf mul都没实现

 

nm app1:

Mul是已经实现的

 

 

 

07    gdb调试

 

 

编译的时候 加 -g 参数

gdb app

 

list 1 从第一行开始往后列

 

b 20

 

info b

条件断点

disable

run 

p I (print i

S (step 单步向下执行

display 

n next

s step

当定义到一个函数的时候就有区别了

Next会跳过函数 step会跳入函数

 

ptype

 

 

 

栈帧:

函数调用会在栈上进行存储

 

栈帧:保存局部变量和临时值

 

局部变量

临时值:

 

例:

函数执行一半执行到mul函数 mul函数执行完了 要回到刚才的位置 所以刚才的位置的地址要保存一下 这个就是临时值

 

函数只要调用就产生栈帧

 

当main函数开始调用时 产生一片栈帧,

执行第一个内部的函数时候 在main下面产生一个栈帧

当这个函数执行完毕后 这个栈帧消失

下一个内部函数栈帧生成在main栈帧下面…

 

 

Bt

发现两块栈帧

 

 

Info locals 查看当前栈帧的值

 

 

段错误 直接Run

直接运行 然后停止在段错误的代码

 

08-makefile_x264

 

Vi makefile

Vi Makefile

 

只能起这两个名字 才能使用默认的make命令去执行它

 

 

Makefile里都是一组一组的规则

 

 

规则包含三部分:

 

目标 : 生成目标需要的依赖

      如何生成目标

 

 

App: add.c sub.c mul.c main.c

     gcc add.c sub.c mul.c main.c

 

 

Make

 

 

比如一个main.c有三个依赖,我只修改了一个依赖 我不希望每次都把所有.c都编译

这时候可以使用makefile

 

Makefile:

app: add.o sub.o mul.o main.o

     gcc add.o sub.o mul.o main.o -o app

add .o: add.c

     gcc -c add.c -o add.o

sub.o: sub.c

     gcc -c sub.c -o sub.o

mul.o: mul.c

     gcc -c mul.c -o mul.o

main.o:main.c

     gcc -c main.c -o main.o

 

 

然后我修改一个依赖

然后make , makefile会智能地只编译修改过的c文件

 

.c(依赖)的修改时间比.o(目标)的修改时间晚, 所以需要重新生成目标

 

重新生成目标后add.o 的修改时间比app晚 所以需要重新生成目标

 

 

 

 

 

然后 make clean

 

 

 

-n 命令 查看执行make的话会做什么

 

make clean -n

 

自动变量

$@

 

$<

 

$^

 

(当$< 和$^ 都可以用的时候 建议用$<    因为后边会用它写模式规则)

第三个参数中包含第一个参数的部分替换为第二个参数

 

 

补充小知识:

%也是通配符

 

 

现在就可以 向里面加.c 调整.h 而不用调整makefile了

 

make clean 因为clean得依赖修改时间没有变化(没有依赖)

           所以会提示没有更新

 

解决方法:

.PHONY: clean

把clean 声明称尾目标 不管依赖条件满不满足都会去执行它

 

 

 

小技巧 rm前面加-

-rm

意思是无论是否出错 后序命令都正常执行

 

因为有时候rm遇到无法删除得文件报错了 后面就都删除不了了

 

 

当文件不叫makefile得时候要用-f指定

 

make –f xxxx

 

 

 

make默认第一条规则是终极目标 如果第一个是完成了 就不往下执行了

如果想随便掉换行需要指定终极目标

ALL:app 放在最开始

 

 

模式规则:

 

 

静态模式规则:

 

 

最终版:

 

通常的项目目录

03-Linux命令基础-第03天(makefile、静态库、动态库、gdb调试工具)的更多相关文章

  1. Linux实战教学笔记04:Linux命令基础

    第四节:Linux命令基础 标签(空格分隔):Linux实战教学笔记 第1章 认识操作环境 root:当前登陆的用户名 @分隔符 chensiqi:主机名 -:当前路径位置 用户的提示符 1.1 Li ...

  2. linux命令基础(一课)

    一.Linux命令基础 1.shell Linux系统中运行的一种特殊程序 在用户和内核之间充当'翻译官' 用户登录Linux系统时,自动加载一个shell程序 bash是Linux系统中默认使用的s ...

  3. linux静态与动态库创建及使用实例

    一,gcc基础语法: 基本语法结构:(由以下四部分组成) gcc -o 可执行文件名 依赖文件集(*.c/*.o) 依赖库文件及其头文件集(由-I或-L与-l指明) gcc 依赖文件集(*.c/*.o ...

  4. Linux 静态库&动态库调用

    1.什么是库在windows平台和linux平台下都大量存在着库.本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行.由于windows和linux的本质不同,因此二者库的二进制是不 ...

  5. Linux中创建和使用静态库&动态库

    库本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行 Linux下库的种类 linux下的库有两种:静态库和共享库(动态库). 二者的不同点在于代码被载入的时刻不同. 静态库的代码在 ...

  6. linux 命令基础一。

    UNIX是什么 UNIX的定义: UNIX是一个计算机操作系统,一个用来协调.管理和控制计算机硬件和软件资源的控制程序. UNIX操作系统的特点:多用户和多任务多用户表示在同一时刻可以有多个用户同时使 ...

  7. Linux命令(基础3)

    关机重启 reboot poweroff ============================ linux命令分类 1.针对不同文件的管理命令 1.1 目录 FHS 文件系统层次化标准 绝对路径: ...

  8. Linux命令基础1-环境介绍

    1.linux的简单历史 1)先有unix,后来有linux 2)linux操作系统是开源和免费的,里面的软件可能部分要收费 3)linux有不同发行版本,redhat,centos等. 4)1991 ...

  9. Linux命令基础#1

    系统基础 三大部件:CPU 内存 IO 1.CPU :运算器 控制器 存储器 2.内存:CPU的数据只能从内存读取,且内存数据有易失性(页面) 3.IO:控制总线 数据总线(一个IO) OS原理: O ...

随机推荐

  1. HDU 4542

    T_T终于让我过了,坑啊,竟然时限是200ms... 我是预处理出不整除了个数的,因为这个较容易一点.利用算术基本定理,f=p1^a1*p2^a2...... 所以,整除它的个数就是(a1+1)*(a ...

  2. [转]supervisor 安装、配置、常用命令

    原文: http://www.cnblogs.com/xueweihan/p/6195824.html ------------------------------------------------ ...

  3. Eclipse启动时提示fail to create the Java Virtual Machine问题的解决

    今天偶然打开Eclipse.发现无法打开,出现例如以下提示: 后来经过上网查询.发现是eclipse.ini文件的问题,打开eclipse安装文件夹下的eclipse.ini文件: -startup ...

  4. CSDN处理问题神速,顶你,为你点32个赞!

    今天10点左右发表了一篇文章,发表之后.文章状态待审核,博文首页不能显示文章,例如以下图所看到的: 于是果断给官网发了第一封Email.10点19分.CSDN给予回复,内容例如以下: 尊敬的用户您好: ...

  5. MySQL命令行登陆

    环境介绍 OS:CentOS6.X & Win2003 & Win2008 MySQL版本号:5.5.x 除了经常使用的MySQL管理工具,还有MySQLclient命令行工具经常被用 ...

  6. luogu1993 小K的农场

    题目大意 小K在MC里面建立很多很多的农场,总共n个,以至于他自己都忘记了每个农场中种植作物的具体数量了,他只记得一些含糊的信息(共m个),以下列三种形式描述: 农场a比农场b至少多种植了c个单位的作 ...

  7. PCB 工程系统 模拟windows域帐号登入

    一.需求描述: 对于PCB制造企业来说,基本都采用建立共享目享+域名管控权限,好像别的大多数行业都是这样的吧.呵呵 在实际应用中,经常会有这样的问题,自己登入的帐号没有共享目录的权限,但又想通过程序实 ...

  8. poj3071Football(概率期望dp)

    Football Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5620   Accepted: 2868 Descript ...

  9. alipay.trade.refund (统一收单交易退款接口)[支付宝退款]

    首页官网退款的api: https://doc.open.alipay.com/docs/api.htm?spm=a219a.7395905.0.0.UTBitT&docType=4& ...

  10. C#方法的练习

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Demo ...