has text relocation问题与so共享库

12 篇文章 0 订阅

 

1.什么是so共享库?

   so共享库就是一个函数库

 

2.so共享库没有main函数

    写一个so的代码如下,编译后就变成.so文件了

  

int max(int a,int b){
    if(a>b)
        return a;
    else
        return b;
}
int add(int a,int b){
    return a+b;
}

 

3.java调用so库

public class Hello{

public native static int add(int x,int y); //java 代码中声明 native 方法

static {
    System.load("/home/lance/main.so");  //以绝对路径加载so文件    }

public static void main(String[] args){  
    System.out.println(add(1,1));    
}

}

 

4.has text relocation 出现的原因是so库没有使用PIC编译,不是位置无关代码

 

so库的一个关键目的是为了使多个进程共享内存中的同一份代码,节约内存资源。

如何做到呢?

1.预先为每一个so库指定好加载的地址范围,然后要求加载器总是将so库加载至指定的位置。这种方法简单但会产生一些严重的问题。一个进程没有用到某个库,相应的地址范围依然会被保留下来,内存使用效率很低。管理也困难。我们必须保证预留的地址块之间没有重叠。每当一个库被修改后,我们还必须要保证它能被放回到修改前的位置,否则,我们还要为它重新找一个新的位置。当我们创建一个新的库时,我们还要为它寻找合适的空间,地址空间碎片化造成的大量无用的内存空洞。更糟糕的是,不同的系统为动态库分配内存的方式不尽相同,这使得管理起来更为困难。
2.将动态库编译成可以在任意位置加载而无需链接器进行修改。这样的代码被称作位置无关代码(PIC)。GNU编译系统可以通过指定-fPIC选项来生成PIC代码。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值