编译相关
文件查看
objdump 关键命令
反汇编
objdump -d xxx.o
显示头文件信息
objdump -f xxx.o
查看文件有哪些符号,包括数据段、导出的函数、引用其他库的函数
objdump -tT xxx.so
objdump -x xxx.so
查看依赖
objdump -x xxx.so | grep "NEEDED"
lipo
lipo源于mac系统要制作兼容powerpc平台和intel平台的程序,lipo 是一个在 Mac OS X 中处理通用程序(Universal Binaries)的工具,主要用于查看,修改Mac OS X 中的通用程序。
(a)查看frameWork支持架构 lipo -info xxx.framework/xxx 输出结果:Architectures in the fat file: xxx.framework/xxx are: i386 x86_64 armv7 arm64
(b)合并framework lipo -create xxx(i386).framework/xxx xxx(armv7).framework/xxx -output xxx.framework.xxx 说明:通过编译产生的动态库/静态库,均为单一架构支持(模拟器/真机),其中i386和x86_64均为模拟器架构,armv7和arm64为真机架构,通过合并产生的framework才是全架构支持
(c)拆分framework lipo xxx.framework/xxx -thin i386 xxx.i386 说明:次操作将单独分离出仅支持i386的动态库/静态库文件, x86_64 armv7 arm64可同理分离,可以配合合并操作去除不需要的架构支持,用于动态库/静态库瘦身。
简述ar操作
ar是linux提供的维护链接编辑器使用的索引库
-
要创建一个库,请输入: ar -v -q lib.a strlen.o strcpy.o 如果 lib.a 库不存在,则此命令创建它,并将文件 strlen.o 和 strcpy.o 的副本输入其中。如果 lib.a 库存在,则此命令在不检查相同成员的情况下,将新的成员添加到末尾。v 标志设置详细方式,在此方式中 ar 命令在其进行时显示进程报告。
-
要显示库的目录,请输入: ar -v -t lib.a 此命令列出了 lib.a 库的目录,显示类似于 ls -l 命令的输出的长列表。要只列出成员文件名称,则省略 -v 标志。
-
要替换或添加新成员到库中,请输入: ar -v -r lib.a strlen.o strcat.o 此命令替换成员 strlen.o 和 strcat.o。如果 lib.a 如示例 1 中显示的那样创建,则替换 strlen.o 成员。因为不存在名为 strcat.o 的成员,所以它被添加到库的末尾。
-
要指定在何处插入新成员,请输入: ar -v -r -b strlen.o lib.a strcmp.o 此命令添加 strcmp.o 文件,并将该新成员置于 strlen.o 成员之前。
-
要更新一个已经更改过的成员,请输入: ar -v -r -u lib.a strcpy.o 此命令替换现有 strcpy.o 成员,但仅当文件 strcpy.o 自从最后一次添加到库后已经修改时才替换它。
-
要更改库成员的顺序,请输入: ar -v -m -a strcmp.o lib.a strcat.o strcpy.o 此命令将成员 strcat.o 和 strcpy.o 移动到紧跟在 strcmp.o 成员之后的位置。保留 strcat.o 和 strcpy.o 成员的相对顺序。换句话说,如果在移动之前 strcpy.o 成员在 strcat.o 成员之前,那么(移动后)它依旧如此。
-
要解压缩库成员,请输入: ar -v -x lib.a strcat.o strcpy.o 此命令将成员 strcat.o 和 strcpy.o 分别复制到名为 strcat.o 和 strcpy.o 的文件。
-
要解压缩并重命名一个成员,请输入: ar -p lib.a strcpy.o >stringcopy.o 此命令将成员 strcpy.o 复制到一个名为 stringcopy.o 的文件。
-
要删除一个成员,请输入: ar -v -d lib.a strlen.o 此命令从 lib.a 库中删除成员 strlen.o。
-
要从多个用 ld 命令创建的共享模块中创建一个压缩文档库,请输入: ar -r -v libshr.a shrsub.o shrsub2.o shrsub3.o … 此命令从名为 shrsub.o、shrsub2.o、shrsub3.o 等等的共享模块中创建名为 libshr.a 的压缩文档库。要编译并链接使用 libshr.a 压缩文档库的 main 程序,请使用以下命令:
cc -o main main.c -L/u/sharedlib -lshr main 程序现在是可执行的。main 程序引用的任何符号(包含在libshr.a 压缩文档库中)已经因延迟分辨率而作了标记。-l 标志指定应在 libshr.a 库中搜索这些符号。
- 要列出 lib.a 的内容(忽略任何 32 位目标文件),请输入: ar -X64 -t -v lib.a
- 要从 lib.a 解压缩所有 32 位的目标文件,请输入: ar -X32 -x lib.a
- 要列出 lib.a 中的所有文件,无论是 32 位、64 位或非对象,请输入: ar -X32_64 -t -v lib.a
简述nm操作
nm 命令被用于显示二进制目标文件的符号表
语法 nm(选项)(参数) 举例: nm View.o>View.m nm -A View.o 说明: 选项:[-A:每个符号前显示文件名;-D:显示动态符号;-g:仅显示外部符号;-r:反序显示符号表。] 参数:目标文件,二进制目标文件,通常是库文件和可执行文件