关于链接

1,加载器创建了存储器映像,将可执行文件的相关内容拷贝到了代码和数据段。
接下来加载器跳转到程序的入口点:_start的地址。
_start处的启动代码是在目标文件ctrl.o中定义的,对所有的C程序都是一样的。
0x080480c0 <_start>:
call _libc_init_first
call _init
call atexit
call main
call _exit
首先从.text和.init节中调用初始化例程,启动代码调用atexit例程,它注册了一系列在调用exit函数时应该调用的程序。
然后启动代码调用应用程序的main程序,开始执行我们的c代码。在应用程序返回之后,启动代码调用_exit程序,它将控制返回给操作系统。

[img]http://dl.iteye.com/upload/attachment/250610/0b7c86bb-c43f-3729-88ee-bd23136c4843.png[/img]

实例代码:

#include <stdio.h>
#include <stdlib.h>
void exit_1(void)
{
printf("exit1 called!\n");
}

void exit_2(void)
{
printf("exit2 called!\n");
}

int main(void)
{
atexit(exit_1);
atexit(exit_2);
printf("main called!!!\n");
exit(0);
}

2,静态库的生成和使用:
源文件addvec.c和multvec.c生成静态库libvector.a
gcc -c addvec.c multvec.c
ar rcs libvector.a addvec.o multvec.o

主函数:
gcc -O2 -c main2.c

链接:
gcc -static -o staticp2 main2.o ./libvector.a

执行:
./staticp2

size staticp2
text data bss dec hex filename
507269 1928 6948 516145 7e031 staticp2

[img]http://dl.iteye.com/upload/attachment/250606/0bed22ce-f3f8-3633-b632-2d0db07dafe5.png[/img]

3,动态库的生成和使用:
源文件addvec.c和multvec.c生成静态库libvector.so
gcc -shared -fPIC -o libvector.so addvec.c multvec.c

主函数:
gcc -O2 -c main2.c

链接:
gcc -o sharedp2 main2.o ./libvector.so

执行:
./sharedp2

size sharedp2
text data bss dec hex filename
1246 292 16 1554 612 sharedp2

注:明显比静态库小很多。

[img]http://dl.iteye.com/upload/attachment/250608/d32cb0b2-7b3d-3a10-82a5-df6a27f3e641.png[/img]


源文件:

addvec.c :
void addvec(int *x, int *y,
int *z, int n)
{
int i;

for (i = 0; i < n; i++)
z[i] = x[i] + y[i];
}

multvec.c:

void multvec(int *x, int *y,
int *z, int n)
{
int i;

for (i = 0; i < n; i++)
z[i] = x[i] * y[i];
}

vector.h:

void addvec(int *x, int *y, int *z, int n);
void multvec(int *x, int *y, int *z, int n);

main2.c:

#include <stdio.h>
#include "vector.h"

int x[2] = {1, 2};
int y[2] = {3, 4};
int z[2];

int main()
{
addvec(x, y, z, 2);
printf("z = [%d %d]\n", z[0], z[1]);
return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值