gcc命令参数:
-o filename
指定输入文件的文件名;
-c
只输出.o文件;
-Ipath
指定.c文件中include文件的路径;
-E
只预编译;
例:
# gcc –E –I. –o su.i su.c(将预编译输出到su.i文件)
# gcc –c –o su.o su.i(生成su.o文件)
-Lpath
指定库文件路径;
-llibname
指定库文件的名字,比如“lib*.a”,libname取“*”部分;
例:
# gcc –o su –L. –lcoreutils –lcrypt(链接静态库libcoreutils.a、动态库libcrypt.so)
静态库制作方法:
# ar cru libcoreutils.a allocsa.o fprintftime.o 。。。
从静态库中删除.o文件:
# ar –d libcoreutils.a allocsa.o。。。
动态库制作方法:
# gcc -shared -fPIC -o libhello.so hello.o
编译时指定动态库导出函数:
# gcc -shared -fPIC -Wl,--version-script=export.map -Llib -o libchk.so check.o -lcoreutils -lcrypt
其中export.map内容如下:
{
global:check;
local:*;
};
则check函数为导出函数。
查看库或.o文件中包含的符号(函数名称):
# nm libcoreutils.a
nm命令的输出包含三个部分:
1、符号值。默认显示十六进制,也可以指定;
2、符号类型。小写表示是本地符号,大写表示全局符号(external);
3、符号名称。如:
00000440 t _init
U abort@@GLIBC_2.0
00000490 t call_gmon_start
U calloc@@GLIBC_2.0
00000641 T check
00001ba0 b completed.5766
0000057c t correct_password
U crypt@@GLIBC_2.0
U dcgettext@@GLIBC_2.0
其中符号名称的含义:
A 符号值是绝对的。在进一步的连接中,不会被改变。
B 符号位于未初始化数据段(known as BSS)。
C 共用(common)符号。共用符号是未初始化的数据。在连接时,多个共用符号可能采用一个同样的名字,如果这个符号在某个地方被定义,共用符号被认为是未定义的引用。
D 已初始化数据段的符号。
G 已初始化数据段中的小目标(small objective)符号。一些目标文件格式允许更有效的访问小目标数据,比如一个全局的int变量相对于一个大的全局数组。
I 其他符号的直接应用,这是GNU扩展的,很少用了。
N 调试符号。
R 只读数据段符号。
S 未初始化数据段中的小目标(small object)符号。
T 代码段的符号。
U 未定义符号。
V 弱对象(weak object)符号。当一个已定义的弱符号被连接到一个普通定义符号,普通定义符号可以正常使用,当一个未定义的弱对象被连接到一个未定义的符号,弱符号的值为0。
W 一个没有被指定一个弱对象符号的弱符号(weak symbol)。
- a.out目标文件中的刺符号(stabs symbol)。这种情况下,打印的下一个值是其他字段,描述字段,和类型。刺符号用于保留调试信息。
? 未知符号类型,或者目标文件特有的符号类型。
查看库或.o文件中包含的外部符号:
# nm -g libcrypt.so