一、Linux应用程序地址布局
1.从低地址到高地址分别分:代码段,数据段,BSS段,堆,栈
2.堆是向高地址内存生长的
3.是向低地址内存生长的
4.查看程序内存地址分配
使用 ps aux 找到进程的PID
使用命令 cat /proc/(进程的PID)/maps查看内存地址分配\
5.
代码段具有可读可执行属性
数据段具有可写属性
6 . 各段的数据存放
数据段
全局的 初始化的变量
全局的 未初始化的变量
全局的 静态的 初始化的变量
全局的 静态的 未初始化的变量
BSS段 (readelf -S 程序名 分析数据段) BSS段是数据段的一部分
全局的 没有初始化的 变量
全局的 静态的 未初始化的变量
代码段
代码
全局常量(const)
字符串常量
堆
堆
常动态分配的内存
栈
局部的 未初始化的 变量
局部的 初始化的 变量
局部的 只读的(const) 变量
二
、静态函数库的设计
1.
函数库按照链接方式分为:
动态链接库
静态链接库
2.linux应用程序函数库的存放目录
/usr /usr/lib
以*.so.*命名的 动态函数库
以*.a*命名的 静态函数库
3.linux下进行编译时,默认使用动态链接库
gcc -static test.c -o test
readelf -d hello 查看使用的库方式
4.制作静态链接库
gcc在链接时,只会C函数库,而对于其他库需要使用-l选项来指定
步骤:
1.gcc -c tax.c
#include<stdio.h>
int tax(int salary ,int insurance)
{
int tax_salary=salary-insurance ;
int tmp=tax_salary-3500;
if(tmp<0)
{
printf("you dount need tax\n");
}
if(tmp<=1500)
{
return(tmp*0.03-0);
}
if((1500<tmp)&&(tmp<=4500))
{
return (tmp*0.1-150);
}
if((4500<tmp)&&(tmp<=9000))
{
return (tmp*0.2-555);
}
if((9000<tmp)&&(tmp<=35000))
{
return (tmp*0.25-1005);
}
if((35000<tmp)&&(tmp<=55000))
{
return (tmp*0.3-2755);
}
if((55000<tmp)&&(tmp<=80000))
{
return (tmp*0.3-5505);
}
}
2.ar cqs libtax.a tax.o
3.将产生的libtax.a复制到 usr/lib/目录下
4.编写应用程序使用该库
#include<stdio.h>
#include"tax.h"
void main()
{
int my_tax=0;
my_tax = tax(9000,1200);
printf("I need tax %d\n",my_tax);
}
5. 使用 gcc -static mytax.c -ltax -o mytax编译该应用程序
三
、动态态函数库的设计
步骤:
1.
gcc -c tax.c
2.gcc -shared -fPIC tax.o -o libtax.so
3.
.将产生的libtax.so复制到 usr/lib/目录下
4.编写应用程序使用该库
#include<stdio.h>
#include"tax.h"
void main()
{
int my_tax=0;
my_tax = tax(9000,1200);
printf("I need tax %d\n",my_tax);
}
5. 使用 gcc -static mytax.c -ltax -o mytax编译该应用程序