ar 命令详解

今天,跟着我们的技术大牛学了不少东西,首先就是这个ar命令啦。

当我们的程序中有经常使用的模块,而且这些模块在其他程序中也会用到,为了实现代码重用减少软件开发周期,我们可以将它们生成库,在需要的时候直接调用就可以了。这里介绍命令的ar,就是用来对库操作。在实际的项目中ar命令一般是写在makefile中,或者shell脚本中。

ar 命令

可以用来创建、修改和提取库(档案archives)

命令格式

ar [--plugin name] [-X32_64] [-]p[mod [relpos] [count]] archive [member...]

简述

库是一单独的文件,里面包含了按照特定的结构组织起来的其它的一些文件(称做此库文件的member)。原始文件的内容、模式、时间戳、属主、组等属性都保留在库文件中。

p关键字指定执行的操作(必须指定其中之一)

d

从库中删除模块。用member指定要删除模块的名称,如果没有指定删除模块的名称,不会对库产生影响。

如果指定 v 修饰符,则ar会列出每个被删除的模块。

m

用这个操作可以在库中移动模块(member)。

如果一个标志(变量?符号)在多个模块中被定义,那么模块在库中的顺序将会对程序链接成库产生不同的影响。

如果没有修饰符和m一起使用,那么任何指定的模块都将移动到库的最后。你可以使用 a ,b 或者 i 修饰符将模块移动到规定的位置。

p

显示指定的模块到标准输出。如果指定 v 修饰符,则将在显示内容之前显示模块名。

如果你没有指定任何模块的话,它将输出库中所有的内容。

q

快速追加。增加新模块到库的结尾处。并不检查是否需要替换。a,b 或i修饰符对此操作没有影响,模块总是追加的库的结尾。如果使用了修饰符v则列出每个模块。 这时,库的符号表没有更新,可以用 ar s或ranlib来更新库的符号表索引。

r

在库中插入模块(替换)。当插入的模块名已经在库中存在,则替换同名的模块。如果若干模块中有一个模块在库中不存在,ar显示一个错误消息并离开,并不替换其他同名模块。默认的情况下,新的成员增加在库的结尾处,可以使用a b i修饰符来请求放置在一些已经存在的模块的相对位置。

若使用v 修饰符,我们是为了在每个文件被插入时得到这样一行输出(连带着字母 a 或者 r 来表明文件是被附加还是取代)

t

显示库的模块表清单。一般只显示模块名。如果你想看到the modes (permissions), timestamp, owner, group, and size,那么你可以指定修饰符 v 。

如果你不指定一个模块,档案中的所有文件都会被列出。

如果有多个文件在库中具有相同的名字,默认显示第一个,如果要显示全部则需要请求一个完整的目录

x

从库中提取一个模块。如果不指定要提取的模块,则提取库中所有的模块

可以结合v修饰符来列出每一个被提取的模块。

[ mod ] 修饰符可能会跟在p关键字的后面,用来指定操作的行为变化

a

在库的一个已经存在的模块后面增加一个新的文件。如果使用修饰符a,则应该为命令行中relpos参数指定一个已经存在的模块名。

b

在库的一个已经存在的模块前面增加一个新的文件。如果使用修饰符b,则应该为命令行中relpos参数指定一个已经存在的模块名。

c

创建一个库。不管库是否存在,都将创建。

D

在确定性的模式中起作用?

f

在库中截短指定的名字。缺省情况下,文件名的长度是不受限制的,可以使用此参数将文件名截短,以保证与其它系统的兼容。

i

在库的一个已经存在的模块前面增加新的文件。如果使用修饰符i,则应该为命令行中relpos参数指定一个已经存在的模块名。

l

暂未使用

N

与count参数一起使用,在库中有多个相同的文件名时指定提取或输出的个数。

o

当提取成员时,保留成员的原始数据。如果不指定该任选项,则提取出的模块的时间将标为提取出的时间。

P

进行文件名匹配时使用全路径名。ar在创建库时不能使用全路径名(这样的库文件不符合POSIX标准),但是有些工具可以。这个选项将导致GNU ar匹配文件名使用完整的路径名,可以使用其他工具方便的从存档中提取一个文件。

s

写入一个目标文件索引到库中,或者更新一个存在的目标文件索引。甚至对于没有任何变化的库也作该动作。对一个库做ar s等同于对该库做ranlib。

S

不创建目标文件索引,这在创建较大的库时能加快时间

T

 

u

一般说来,命令ar r...插入所有列出的文件到库中,如果你只想插入列出文件中那些比库中同名文件新的文件,就可以使用该任选项。该任选项只用于r操作选项

v

这个修饰符显示一个操作的详细、额外的信息

V

显示ar的版本

ar忽略了最开始的选项-X32_64,是为了和AIX兼容。

实例:

libmd5.a: md5.o md4.o

@echo Building "libmd5.a..."

ar rv libmd5.a md5.o md4.0

生成了一个库,库名字是md5,链接时可以用-lmd5链接。该库中存放了两个模块md5.o和md4.o。选项前可以有'-'字符,也可以没有。

既然库已经建好了,那么如何查看库包含的模块(函数)呢??

那就使用nm 命令吧!

nm 命令详解

列出目标文件的标识(我们主要用来看库函数,可以结合grep)

命令格式

nm [option(s)] [file(s)]

有用的options:

  • -A 在每个符号信息的前面打印所在对象文件名称;
  • -C 输出demangle过了的符号名称;
  • -D 打印动态符号;
  • -l 使用对象文件中的调试信息打印出所在源文件及行号;
  • -n 按照地址/符号值来排序;
  • -u 打印出那些未定义的符号;

常见的符号类型:

  • A 该符号的值在今后的链接中将不再改变;
  • B 该符号放在BSS段中,通常是那些未初始化的全局变量;
  • D 该符号放在普通的数据段中,通常是那些已经初始化的全局变量;
  • T 该符号放在代码段中,通常是那些全局非静态函数;
  • U 该符号未定义过,需要自其他对象文件中链接进来;
  • W 未明确指定的弱链接符号;同链接的其他对象文件中有它的定义就用上,否则就用一个系统特别指定的默认值。

注意几点:

  • -C 总是适用于c++编译出来的对象文件。还记得c++中有重载么?为了区分重载函数,c++编译器会将函数返回值/参数等信息附加到函数名称中去形成一个mangle过的符号,那用这个选项列出符号的时候,做一个逆操作,输出那些原始的、我们可理解的符号名称。
  • 使用 -l 时,必须保证你的对象文件中带有符号调式信息,这一般要求你在编译的时候指定一个 -g 选项,见 Linux:Gcc
  • 使用nm前,最好先用Linux:File查看对象文件所属处理器架构,然后再用相应交叉版本的nm工具。

这几天项目一直赶得紧,可能更新的不及时,不过还是要坚持,向我的技术老大致敬!

ar命令和nm命令(建库!)的更多相关文章

  1. 打包静态库.a文件的方法(ar,ranlib,nm命令介绍)

    一 常用脚本 1 打包脚本 脚本如下,下面附上ar 和 ranlib命令参考(命令来自于网络) ALLLIB=*.aFILE=`ls *.a`#原来的库解压重命名 for F in $FILEdo   ...

  2. Mysql建库建用户建表等常用命令

    格式: mysql -h主机地址 -u用户名 -p用户密码 1.连接到本机上的MYSQL.首先打开DOS窗口,然后进入目录mysql\bin,再键入命令mysql -u root -p,回车后提示你输 ...

  3. Oracle安装部署之命令建库

    1.建目录: [oracle@wen ~]$ mkdir $ORACLE_BASE/admin/rezin/{a,b,c,dp}dump -p [oracle@wen ~]$ mkdir $ORACL ...

  4. linux中的nm命令简介

    转:http://blog.csdn.net/stpeace/article/details/47089585 一般来说, 搞linux开发的人, 才会用到nm命令, 非开发的人, 应该用不到. 虽然 ...

  5. linux下nm命令的使用

    linux下强大的文件分析工具 -- nm 什么是nm nm命令是linux下自带的特定文件分析工具,一般用来检查分析二进制文件.库文件.可执行文件中的符号表,返回二进制文件中各段的信息. 目标文件. ...

  6. 怎么查看二进制文件内容?linux下nm命令告诉你!

    linux下强大的文件分析工具 -- nm 什么是nm nm命令是linux下自带的特定文件分析工具,一般用来检查分析二进制文件.库文件.可执行文件中的符号表,返回二进制文件中各段的信息. 目标文件. ...

  7. shell的内建命令和外部命令

    shell的内建命令和外部命令 Shell执行的命令可以分为内建命令(built-in)和外部命令(external),前者是构建在shell内部:后者是一个独立的文件(可以是二进制文件,也可以是一个 ...

  8. strings和nm命令

    strings和nm命令 strings 一.简介: 显示文件中的可打印字符 二.用法 strings [option(s)] [file(s)] 选项说明: -a – –all 扫描整个文件而不是只 ...

  9. nm命令中符号类型详解

    摘自http://blog.csdn.net/solmyr_biti/article/details/6565479 nm命令介绍的很多,但大多不介绍其函数符号标志的含义.最近在调试动态库时常用到,其 ...

随机推荐

  1. BZOJ 1055 [HAOI2008]玩具取名

    1055: [HAOI2008]玩具取名 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1119  Solved: 653[Submit][Statu ...

  2. BZOJ 1053 [HAOI2007]反素数ant

    1053: [HAOI2007]反素数ant Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1948  Solved: 1094[Submit][St ...

  3. 「Poetize7」Freda的访客

    描述 Description 小猫们看到蛋糕比饼干大之后,普遍认为蛋糕比饼干要好>.<.所以,如果Freda 给了第i 只小猫蛋糕且这个小猫是第一个吃到蛋糕的,那么就必须给第i+2,i+4 ...

  4. C#中实现邮件发送功能

    public static int sendmail(string to, string body,string subject) { try { int nContain = 0; ///添加发件人 ...

  5. 贪心(数据结构):COGS 468. [NOI2010]超级钢琴

    ★★★☆   输入文件:piano.in   输出文件:piano.out   简单对比 时间限制:2 s   内存限制:512 MB 超级钢琴 [问题描述] 小Z是一个小有名气的钢琴家,最近C博士送 ...

  6. HDOJ(HDU) 2148 Score(比较、)

    Problem Description 转眼又到了一年的年末,Lele又一次迎来了期末考试.虽然说每年都要考试,不过今年的这场考试对Lele来说却意义重大. 因为经济原因,如果今年没有排在班级前几名, ...

  7. sqlserver授予用户查看执行计划的权限

    sqlserver查看语句的执行计划是非常重要的,可以提高开发人员代码的质量.所以有必要授予开发人员对数据库查看执行计划的权限.   查看执行计划的权限属于数据库一级别的权限,具体例子如下   use ...

  8. 一个IT男的创业感言

    2014年的一月 我和高中的一个同学開始人生的第一次创业.就写点第一次创业的经验吧! 创业的最初 须要心中大概有个规划 这个规划可能是非常粗糙的 但大的方向一定要有.详细就是你进入的行业 行业已经存在 ...

  9. VC6项目移植到VS2008的若干问题——好的代码,从我做起,从如今做起。

    近期,有个项目开发,须要用到曾经项目的代码,只是曾经项目都是VC6下编译通过的,在VS2008下不一定编译通过,能编译通过也不一定能链接成功.以下总结一下我在一个VC6项目移植到VS2008中遇到的一 ...

  10. 【剑指offer】二叉树中和为某一值的路径

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26141815 题目描写叙述: 输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数 ...