`

has text relocation问题与so共享库

 
阅读更多

 

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代码。

分享到:
评论

相关推荐

    支持Android6.0以上的串口so文件

    本话题主要关注的是如何处理针对Android 6.0及以上版本的串口通信SO文件,解决在低版本系统上遇到的“has text relocation”问题。 “has text relocation”错误通常出现在尝试加载包含文本重定位的动态链接库时,...

    load-time relocation of shared library

    在Linux环境下,共享库通常以`.so`扩展名结尾。 2. **位置独立代码 (PIC)**:这是一种特殊的代码形式,它可以被加载到内存中的任何位置并能够正常运行,因此非常适合用于共享库中。 #### 加载时重定位的重要性 在...

    用于ubuntu16.04下安装mongodb时缺少的库文件

    在Ubuntu 16.04上安装MongoDB时,可能会遇到一些依赖问题,尤其是在尝试从源代码编译安装或者使用非官方存储库时。标题提到的"用于ubuntu16.04下安装mongodb时缺少的库文件"通常指的是MongoDB运行所必需的一些库文件...

    relocation does not fit in 24 bits 由来及对策

    #### 一、问题背景与概述 在使用VxWorks系统时,用户在处理PowerPC架构下的代码时经常会遇到一个错误:“Relocation value does not fit in 24 bits”。此错误主要发生在使用内存超过32MB的情况下。本文将深入探讨...

    linux x86平台elf 进程注入so并且实现基于rel的hook ubuntu14.01测试通过

    在Linux系统中,ELF(Executable and Linkable Format)是一种标准的可执行文件和共享库格式。本主题探讨的是在x86架构的Linux平台上,如何将动态链接库(.so文件)注入到运行中的ELF进程,并实现基于相对地址...

    PowerPC 动态库

    在PowerPC架构上,动态链接库(DLL)通常被称为共享对象(SO)或动态库。本文将深入探讨PowerPC平台上的动态库,包括其工作原理、动态解析机制以及相关的编程实践。 首先,我们要理解符号解析的过程。在编译期间,...

    Linux下的动态连接库及其实现机制.pdf

    在Linux中,动态连接库通常以`.so`(Shared Object)文件的形式存在。当编译器处理源代码时,它生成目标文件(`.o`),这些目标文件包含了程序的机器指令和数据。接着,链接器将这些目标文件与所需的库链接起来,...

    libfcitxplatforminputcontextplugin.so

    Ubuntu20.04 小企鹅输入法动态库, 使用QT版本5.9.0,尽可能的根据博客自己封装为好

    LINUX动态链接库高级应用

    - 为了避免版本冲突问题,可以在动态链接库文件名中包含版本号,如`libfoo.so.1`。这样,即使新版本的库发布,旧版本的应用程序仍能正常工作。 #### 四、总结 通过上述介绍可以看出,LINUX下的动态链接库不仅能够...

    U-Boot relocation and Debug.zip

    U-Boot relocation and Debug The relocation on arm is working, before u-boot-2010.09,there are two define CONFIG_SKIP_RELOCATE_UBOOT and CONFIG_SKIP_LOWLEVEL_INIT, when they are defined in your board ...

    linux内核课件

    ### 动态链接与共享库加载 #### 动态链接概述 在Linux中,动态链接允许程序在运行时加载所需的库文件(也称为共享对象或共享库)。这样做的好处是可以减少内存占用,因为多个进程可以共享相同的库实例。 #### 共享...

    obj-file-relocation.rar_obj 解析

    在编程和软件开发领域,可重定位文件(Object File)是源代码编译后生成的一种中间格式,它包含了机器码、符号表和其他元数据,用于链接器进一步处理以生成最终的可执行文件或动态库。本篇文章将深入探讨可重定位...

    DSP学习常见的问题

    * illegal relocation type错误是由于rts6400.lib库文件与CCS版本不符,解决方法是使用CCS安装文件夹自带的库文件。 * symbol defined multiple times错误是由于库文件的问题,可以通过更改库文件或调整include...

    libboost_python

    这个库可以解决如下编译错误问题! /usr/bin/ld: libboost_python.a(from_python.o): relocation R_X86_64_32 against `.rodata.str1.8' can not be used when making a shared object; recompile with -fPIC ...

    boost_linux_fPIC.rar

    boost的linux静态库版本,添加了-fPIC选项,一般的boost静态库没有此选项,动态库在调用的时候会报下面的内容,用了这个库就不会出了(网上教的编译方法都是针对1.55版本的,后面的版本代码都不一样): /usr/bin/...

    lamp安装apache出错的地方

    详细描述中提到,`mod_deflate.so`模块需要文本重定位(text relocation),这是一种在程序运行时修改代码位置的技术,通常在动态链接库中使用。然而,SELinux默认不允许这样做,因为它可能带来安全风险。大多数情况...

    【2022美赛F奖】B题:水电共享

    在2022年的美国数学建模竞赛(MCM)中,获得特等奖的B题研究聚焦于“水电共享”问题。参赛团队针对科罗拉多河流域的水资源分配挑战,提出了一个综合性的数学模型解决方案。科罗拉多河流域正面临降雨短缺和高温的困扰...

    Sensor Relocation in Mobile Sensor Networks

    本文由Guiling Wang, Guohong Cao, Tom La Porta和Wensheng Zhang撰写,发表于宾夕法尼亚州立大学计算机科学与工程系,重点探讨了如何通过移动传感器节点来应对传感器故障或新的事件监测需求。 传感器网络主要由...

Global site tag (gtag.js) - Google Analytics