`
kmplayer
  • 浏览: 500403 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于链接

阅读更多
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程序,它将控制返回给操作系统。



实例代码:
#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



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

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




源文件:
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;
}
  • 大小: 27.5 KB
  • 大小: 40.7 KB
  • 大小: 76.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics