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]
实例代码:
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]
源文件:
multvec.c:
vector.h:
main2.c:
接下来加载器跳转到程序的入口点:_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;
}