so库方法原理
动态库
So库,又动态名库,是Linux下最常见的文件之一,是一种ELF文件。这种so库是程序运行时,才会将这些需要的代码拷贝到对应的内存中。但程序运行时,这些地址早已经确定,那程序引用so库中的这些代码地址如何确定呢,这就是这次要整理学习的内容,即so库的在链接和执行时的加载过程。

静动态库
先聊静态库。为了程序更加优雅和高效,每一个程序的完成都是采用分而治之的方法,即同一个程序或者项目每个程序员都会完成不同的功能,有的功能是可复用的,而对于一些公共的可复用的功能,会使用库的形式来完成。比如我们在不同模块中多次用到了一个方法ar_public(),我们就可以将其包装到一个公共的文件里面,这样就如果其他的地方有调用就可以把引用这个公共文件从而调用这个方法,这样就有了静态库。简单来说静态库是链接的时候将库中所用到的程序拷贝进来,这样即使在执行阶段吧对应的库删掉都没有关系,因为此时对应方法的真实内容已经被拷贝过来了。但是虽然能做到方法共用,但带来最大的一个问题是如果是同一个项目的不同模块使用的话,使用的每个模块都会把这些拷贝过来,这样会使得应用的内存增大。也恰恰是由于会将静态库的这些方法拷贝进来如果静态库发生改变的话那程序需要重新编译。
为了解决上面的问题,于是又有了一个动态库的概念。动态库,又称共享库链接的时候它只包含需要的函数引用表,只有在执行的时候那些需要的函数才能被拷贝到内存中,而且在操作系统使用的是虚拟内存,使得一份共享库驻留在内存中被多个程序使用,也同时节约了内存。
位置无关(PIC)
大家都知道,可执行文件在执行期的时候内存地址已经都确定了,而上面说的只有执行时才会确定那些函数地址拷贝到内存中,那基于这个特点大家第一想道的实现就是像那些段一样预留一个空间,但是这样做的一个最大问题就是会造成空间浪费,我们可以readelf去看下so库中的地址情况,从图一来看和data相关的地址都不是绝对地址(由于程序的起始加载地址都是从data开始,所以data相关的头如果不是绝对地址则可以认为加载的地址不固定)。
在动态共享库中,如果库里面的代码发生改变,重新加载进来之后,我们必须保证它放到修改前的位置 ,否则我们还要为它找一个新的位置。而我们对于这个修改之后希望将动态库编译成可以在任意位置加载无需linker进行修改,这个叫做位置无关代码即PIC,也就是生成so库的-fPIC的那个PIC(这个指令就表示生成位置无关代码)。那PIC的原理是如何实现的呢,我们都知道数据段和代码段的距离在运行时是可以确定的,其中就是利用这一点来做地址定位的。
静态分析:
Linux Dynamic Shared Library && LD Linker
https://www.cnblogs.com/cdcode/p/5551649.html
动态链接
聊聊Linux动态链接中的PLT和GOT(1)——何谓PLT与GOT
_dl_runtime_resolve源码分析
【ARM】安卓SO中GOT REL PLT 作用与关系
深入了解GOT,PLT和动态链接
相关文章:

上传图片,多图上传,预览功能,js原生无依赖
最近很好奇前端的文件上传功能,因为公司要求做一个支持图片预览的图片上传插件,所以自己搜了很多相关的插件,虽然功能很多,但有些地方不能根据公司的想法去修改,而且需要依赖jQuery或Bootstrap库,所以我就想…

springboot 简单自定义starter - beetl
使用idea新建springboot项目beetl-spring-boot-starter 首先添加pom依赖 packaging要设置为jar不能设置为pom<packaging>jar</packaging> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web&…

cmake生成so包并调用(C++project,build,cmake)
1. 目录结构 2 . downloads 2.1 build module process CMakeLists.txt > cmake_minimum_required(VERSION 3.5)if(CMAKE_COMPILER_IS_GNUCC)message("COMPILER IS GNUCC")ADD_DEFINITIONS ( -stdc11 ) endif(CMAKE_COMPILER_IS_GNUCC)SET(CMAKE_CXX_FLAGS_DEBU…

人眼模板匹配自动跟踪
void trackEye(cv::Mat& im, cv::Mat& tpl, cv::Rect& rect) {// 人眼位置cv::Size pSize(rect.width * 2, rect.height * 2);// 矩形区域cv::Rect tRect(rect pSize - cv::Point(pSize.width/2, pSize.height/2));tRect & cv::Rect(0, 0, im.cols, im.rows);…

前端碎碎念 之 nextTick, setTimeout 以及 setImmediate 三者的执行顺序
『前端碎碎念』系列会记录我平时看书或者看文章遇到的问题,一般都是比较基础但是容易遗忘的知识点,你也可能会在面试中碰到。 我会查阅一些资料并可能加上自己的理解,来记录这些问题。更多文章请前往我的个人博客这个问题是有关执行顺序和Eve…

bat 将war文件转换成ear文件
1、无需拷贝war文件,自动获取war set path%path%;D:\jdk\jdk1.6.0_31\bin;C:\Program Files\7-Zip del **0001-controller.war del **0001-controllerEAR.ear copy ..\target\**0001-controller-0.0.1-SNAPSHOT.war **0001-controller.war rem 7z d -tzip **0001-co…

cmake语法【一】
一、Cmake 简介 cmake 是一个跨平台、开源的构建系统。它是一个集软件构建、测试、打包于一身的软件。它使用与平台和编译器独立的配置文件来对软件编译过程进行控制。 二、常用命令 指定 cmake 的最小版本 cmake_minimum_required(VERSION 3.4.1)这行命令是可选的ÿ…

RHEL6.3安装vsftpd
1、下载vsftpd,可以从官网(http://vsftpd.beasts.org)下载,也可以百度搜索[rootlocalhost vsftpd]# wget http://down1.chinaunix.net/distfiles/vsftpd-3.0.2.tar.gz2、解压压缩包并进入解压出来的目录[rootlocalhost vsftpd]# t…

创建mysql数据库,在新数据库中创建表,再尝试删除表
创建之前,先登录数据库存 mysql -u 账号 -p密码 登录完成后,展示一下已存在的数据库 show databases; 创建数据库 create database test111; 然后展示一下数据库,如下 show databases; 使用数据库 use test; 在test数据库里面看一下已存在的…

cmake:在各级目录之间共享变量(cmake cache变量)
摘要: 本文记录一下 CMake 变量的定义、原理及其使用。CMake 变量包含 Normal Variables、Cache Variables。通过 set 指令可以设置两种不同的变量。也可以在 CMake 脚本中使用和设置环境变量。set(ENV{} …),本文重点讲述 CMake 脚本语言特有的两种变量。 正文&am…

antd+dva笔记
参考 React中函数式声明组件Dva Ant Design 前后端分离之 React 应用实践ReactDvaJS 之 hook 路由权限控制dva 知识地图react-router Guides and API docs (v2, v3)react-sage redux-saga 是一个用于管理 Redux 应用异步操作,可以用来代替 redux-thunk 中间件。《Redux-saga 中…

求两个矩形重叠部分的面积
#include<stdio.h> #include<math.h>#define areaFile "area.txt" #define perportionFile "perportion.txt"#define min(a,b) ( ((a)>(b)) ? (b):(a) ) #define max(a,b) ( ((a)>(b)) ? (a):(b) )typedef struct xy { int x; int y; …

session,cookie,sessionStorage,localStorage的区别及应用场景
浏览器的缓存机制提供了可以将用户数据存储在客户端上的方式,可以利用cookie,session等跟服务端进行数据交互。 一、cookie和session cookie和session都是用来跟踪浏览器用户身份的会话方式。 区别: 1、保持状态:cookie保存在浏览器端&#x…

鱼眼镜头及其标定
1. 鱼眼镜头特性与镜头分类 普通镜头和针孔相机在数学模型上可以等价对待,都是射影变换(Perspective transform); 鱼眼镜头受到水下斯涅耳窗口现象的启发,采用不同的投影方式,来得到极大的视场角ÿ…

django -- url 的 name 属性
在html的form中使用给url定义的name值,可以在修改url时不用在修改form的src。 urls.py from django.conf.urls import url from mytest import viewsurlpatterns [# url(r^admin/, admin.site.urls),url(r^index/, views.index, namemysite), views.Index.as_view(…

两个矩形重叠部分面积
#include<stdio.h> #include<math.h> #define min(a,b) ( ((a)>(b)) ? (b):(a) ) #define max(a,b) ( ((a)>(b)) ? (a):(b) )typedef struct xy { int x; int y; }xy;void main() {xy a[4];int s,chang,kuang;while (true){printf("Please input 4 x,…

前百度面试官整理的——Java后端面试题(一)
2019独角兽企业重金招聘Python工程师标准>>> List 和 Set 的区别 List , Set 都是继承自 Collection 接口 List 特点:元素有放入顺序,元素可重复 , Set 特点:元素无放入顺序,元素不可重复,重复元…

vibe前景提取算法示例代码
//ViBe.h#pragma once #include <iostream> #include "opencv2/opencv.hpp"using namespace cv; using namespace std;#define NUM_SAMPLES 20 //每个像素点的样本个数 #define MIN_MATCHES 2 //#min指数 #define RADIUS 20 //Sqthere半径 #define SUBSAMPL…

Linux系统程序运行时加载动态库路径顺序
程序运行时加载动态库路径顺序(Linux) 在linux系统中,如果程序需要加载动态库,它会按照一定的顺序(优先级)去查找: 链接时路径(Link-time path)和运行时路径(Run-time path)不是一回…

浮动元素会引起的问题和你的解决办法
问题: (1)父元素的高度无法被撑开,影响与父元素同级的元素(2)与浮动元素同级的非浮动元素会跟随其后(3)若非第一个元素浮动,则该元素之前的元素也需要浮动,否…

Visual Paradigm 教程[UML]:如何使用刻板印象和标记值?(下)
下载Visual Paradigm最新试用版 已加入在线订购,现在抢购立享特别优惠>> 将构造型应用于模型元素 接下来,我们将构造型应用于模型元素。右键单击Customer,然后从弹出菜单中选择Stereotypes> External User。 从图形上看…

基于opencv的简单视频处理类示例
#include "opencv2/opencv.hpp" using namespace std; using namespace cv; class VideoProcessor { private: VideoCapture caputure; //图像处理函数指针 void (*process)(Mat &,Mat &); bool callIt; string WindowNameInput; string WindowNa…

flex数据绑定
2019独角兽企业重金招聘Python工程师标准>>> 1 、方法绑定 [Bindable(event"myFlagChanged")] private function isEnabled():String { if (myFlag)return true; else return ‘false; } <mx:TextArea id"myTA" text"{isEnabled()}&…

【error】error: field * has incomplete type
在编译程序是出现了如题错误, 类或结构体有前向声明的用法,编译到这里时还没有发现定义,不知道该类或者结构的内部成员,没有办法具体的构造一个对象,所以会报错。 两种解决方法: 方法一:将类成员…

Web前端学习笔记:Vue生命周期理解
一、感谢原创博主 示例代码出处vue2.0 探索之路——生命周期和钩子函数的一些理解 官方文档 二、生命周期简单描述 总共分为8个阶段创建前/后,载入前/后,更新前/后,销毁前/后。 创建前/后 在beforeCreated阶段,vue实例的挂载元素…

获取结构体中变量的偏移量
C/C获取结构体中变量的偏移量 1.某些特殊需求下,我们需要知道某个变量在其结构体中的偏移位置。 通常的做法就是定义一个宏变量,如下: #define OFFSET(structure, member) ((int64_t)&((structure*)0)->member) // 64位系统 #defin…

VS2010 CUDA 5.5 VA_X Win7 64位配置
一.安装CUDA5.5以及配置VS助手 1、安装之前必须确认自己电脑的GPU支持CUDA。在设备管理器中找到显示适配器(Display adapters),找到自己电脑的显卡型号,如果包含在http://www.nvidia.com/object/cuda_gpus.html的列表中,说明支持…

SmartRoute之大规模消息转发集群实现
为什么80%的码农都做不了架构师?>>> 消息转发的应用场景在现实中的应用非常普遍,我们常用的IM工具也是其中之一;现有很多云平台也提供了这种基础服务,可以让APP更容易集成相关功能而不必投入相应的开发成本。对于实现…

unity项目警告之 LF CRLF问题
unity中创建的脚本,以LF结尾。 Visual studio中创建的脚本,以 CRLF结尾。 当我们创建一个unity脚本后,再用VS打开编辑保存后,这个文件既有LF结尾符,也有CRLF结尾符。 解决办法:更改unity的代码生成模板&…

Eigen向量化内存对齐/Eigen的SSE兼容,内存分配/EIGEN_MAKE_ALIGNED_OPERATOR_NEW
1.总结 对于基本数据类型和自定义类型,我们需要用预编译指令来保证栈内存的对齐,用重写operator new的方式保证堆内存对齐。对于嵌套的自定义类型,申请栈内存时会自动保证其内部数据类型的对齐,而申请堆内存时仍然需要重写operat…