linux编译扼概

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值