首页
学习
活动
专区
圈层
工具
发布

《程序员的自我修养》笔记

默认情况下,当程序需要动态链接库符号地址的时候会把共享库加载到自己进程的内存地址里面(因为程序需要使用动态链接的符号地址,但是这个地址怎么知道呢,就是把库加载到各自进程的内存里面),也就是说每个进程还会进行加载这些内容到进程私有的虚拟内存里面...,所以代码段也需要都加载到内存,无法做到进程共享复用代码段。...这里说的是程序要用动态库符号的地址(这个地址再目标文件里是不知道的,得等到加载到 每个进程里面就知道了),动态库本身是通过偏移来引用的所以动态库用自己的符号是知道自己地址的不需要做重定位。...也就是说访问动态链接��号的地址就是访问got表里面记录这个符号的地址,而got里会记录动态库加载后符号的地址因此通过got可以间接访问运行时加载的符号地址。...(一次简介访问got拿到真实地址,第二次访问拿到的真实地址) 2.动态链接的程序 每次运行的时候都会先运行动态链接器把所有的动态库加载起来之后再去修复got表里面的动态符号地址,再然后才会运行程序,如果动态库很多

55310
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    win10下安装使用pytorch以及cuda9、cudnn7.0

    pytorch是一个优雅的深度学习库,相比TensorFlow更年轻也更充满潜力,在官方的介绍中pytorch只支持linux和mac,但其实windows也是可以安装以及正常使用的 平台: win10...(版本1709) CPU:i5-7400 显卡:1060 6G 内容:8G 软件: anaconda3 pycharm专业版 首先从官网下载相应的cuda和cudnn库,记住下载win10版本的.../iamoldpan/article/details/78459208 windows下安装cuda和cudnn还是非常容易的,下载最新版即可(cuda9.0和与之相对应的cudnn版本) 安装好之后,...选择解释器后,开始conda环境中只有刚开安装的几个程序包,这是需要安装pytorch需要的依赖包: 注意:一定要在虚拟环境中进行安装,如果在终端中创建了虚拟环境但是无法激活,可以通过conda install...2F 我安装的是,pytorch-0.2.1-py36he6bf560_0.2.1cu80.tar.bz2,即python3.6-cuda8版本的安装包下好后,进入到该文件的目录中,在终端中输入: pip

    2.1K90

    【Android 逆向】ELF 文件格式 ( 程序头数据 | 节区头数据 | 动态符号表 )

    , 如 : 程序头本身信息 加载 动态库相关信息 GNU 编译器相关信息 二、节区头数据 ---- 节区头数据中 , 有 21 个入口 , 每个入口各有 40 字节 , 分别代表不同的功能 ; SHN_UNDEF...: 未定义的保留区域 , 所有的 ELF 都有该区域 , 一些加固软件会抹掉该区域数据 , 导致解析 ELF 文件时 无法找到 后面的 代码 , 符号 等节区数据 , 在运行时在将该区域添加上去 ;....text : 代码数据 ; .plt : 引用的外部的库 ; .got : 全局符号表 , 包含导入导出数据 ; 重要的符号信息 ( 函数 , 全局变量 ) , 都在该数据区域中 ; .data :...数据段 ; .bss : BSS 段 ; .comment : 注释 ; .shstrtab : 字符串表 ; 由下图可以看出 , 节区头 数据 在 ELF 文件的 末尾 位置 ; 三、动态符号表...---- 动态符号表示导入导出的符号数据 ; 下图中 , 不带 [U] 的项目 是导出的符号 , 是本函数库向外提供的 ; 带 [U] 的符号是导入的符号 ;

    63910

    ELF文件从形成到加载轮廓

    如果使用动态链接,还会处理动态符号表(.dynsym)和全局偏移表/过程链接表(.got.plt),为运行时加载动态库做准备。...静态链接会将静态库(.a)内容直接嵌入可执行文件;动态链接则引用动态库(.so),仅记录加载信息,运行时由动态链接器(如 /lib64/ld-linux-x86-64.so.2)加载。...如果程序使用动态库,加载时动态链接器(如 ld-linux.so)会解析 .dynamic 和 .got.plt Section,加载共享库并绑定符号。...动态链接的程序在加载时,动态链接器(如 /lib64/ld-linux-x86-64.so.2)解析 .dynamic 和 .got.plt,加载共享库并绑定符号,确保程序运行时能访问外部函数。...动态链接与符号表: 可执行文件可能还有 .dynsym(动态符号表),用于动态链接,记录与共享库相关的符号(如 libc 中的函数)。

    1.3K11

    我与C语言二周目邂逅vlog——8.编译和链接

    静态库会在链接时被拷贝到可执行文件中,而动态库则是在程序运行时动态加载的。 6.3 链接的类型 静态链接:在静态链接中,链接器将所有目标文件和所需的库函数全部复制到最终的可执行文件中。...因此,静态链接生成的可执行文件体积较大,但在运行时不再依赖外部库。 动态链接:在动态链接中,链接器只将动态库的引用加入到可执行文件中,而动态库的实际内容则在程序运行时由操作系统加载。...类型错误:变量的类型不匹配,如将 int 变量赋值给 char 指针。 未定义的变量:使用未定义的变量或函数。 7.2 链接错误 链接错误是在链接阶段出现的问题,通常与符号解析和重定位有关。...例如: 未定义的引用:目标文件中引用了一个未定义的符号,例如函数的声明找不到对应的实现。 重复定义:多个目标文件中存在相同的全局变量或函数实现,导致符号冲突。...例如,在 Linux 中,标准库的静态库为 libc.a。 动态链接库(.so 文件):动态链接库在程序运行时被加载,多个程序可以共享一个动态链接库,从而节省内存和磁盘空间。

    74010

    【Linux系统编程】(二十九)深度解密静态链接:从目标文件到可执行程序的底层魔法

    链接器的第一个任务就是收集所有目标文件的符号表,解析未定义符号—— 找到每个未定义符号在哪个目标文件中定义,建立全局符号映射。...3.4 静态库的链接优先级:动态库优先 Linux 下编译器默认优先链接动态库(.so),只有当找不到动态库时,才会链接同名的静态库(.a)。...更新符号表:建立全局符号表,移除未定义符号(已解析)。 修正重定位:根据新的节布局,修正所有重定位表中的地址。...更新维护麻烦:如果静态库存在 bug 或需要优化,所有使用该库的程序都需要重新编译链接,无法像动态库那样直接替换库文件即可更新。...内存占用高:多个进程运行时,每个进程都加载一份静态库的代码到内存,而动态库可以被多个进程共享,节省内存。

    7710

    Tensor Core

    我们在新的CUDA 9.0里增加了一个秘密空间——WMMA,可以调用其中的API去实现输入矩阵的Load(加载),两个矩阵做乘加,还有结构矩阵的Store(存储)。...而第二种方式相对比较简单,可以利用现成的库函数,最新版本的cuDNN7.0、CUDA9.0中的cuBLAs,TensorRT3.0都支持Tensor Core的调用。...Tensor Core的功能正在被集成到越来越多的深度学习框架里去,目前Tensor Core可以支持的深度学习框架有Caffe、Caffe2、MXNet、PyTorch、Theano、TensorFlow...第二幅图是一个benchmark的测试结果,左侧的灰色的柱状表示的是Tesla P100+CUDA8调用cuBLAS库,进行混合精度的矩阵乘法得到的性能,而右侧绿色的柱状表示Tesla V100+CUDA9...调用cuBLAS库,实现混合精度矩阵乘法的性能。

    2.6K80

    【linux】基础开发工具(3)gccg++,动静态库

    2.解析符号:链接器扫描所有目标文件,构建一个全局符号表,记录每个符号的定义位置。如果同一个符号被多次定义,链接器会报错(除非是弱符号)。如果某个符号未定义,链接器会从静态库中查找。...运行时链接(程序加载时): 加载动态库:当程序运行时,动态链接器(如ld-linux.so)首先检查可执行文件所依赖的动态库,然后在系统预设的路径(如/lib, /usr/lib)或用户指定路径(如LD_LIBRARY_PATH...运行时链接的两种方式: 加载时链接:在程序启动时由动态链接器完成所有符号的解析和重定位。...运行时链接:程序在运行过程中通过动态链接器提供的API(如dlopen, dlsym)动态加载库和解析符号。...但是如果可执行文件的库文件缺失会导致链接失败,程序无法运行。使用同一个动态库的进程,如果动态库缺失未启动的进程由于动态库缺失会启动失败。运行中的进程会崩溃。

    15910

    g++演示如何从C++代码到可执行程序

    链接阶段:g++ main.o foo.o -o app 编译器把多个.o文件(包括库文件.a/.so)拼成一个可执行文件或共享库: 符号解析:把main.o里未定义的符号去别的.o/.a/.so里找定义...地址分配和段合并: 把各个.text/.data合并,给每个符号分配最终地址 重定位: 把机器码/数据中”占位“的地址改成最终地址 处理库依赖: 静态库.a:把需要的目标文件成员抽取进行最终程序 动态库...动态库和静态库 动态库:用的时候,程序只记住去哪里找,真正运行时再加载 静态库:用的时候,把代码直接拷贝到程序里 我们还是用add这份代码,不要模板 2.1....动态库 Linux下:.so为后缀的文件,本质是独立存在的二进制文件 怎么生成?...(0x00007fdfcf192000) 动态库:编译时只记住地址,运行时再加载代码 2.2.

    17710

    面试周刊(4):类自定义 newdelete ?三阶段(编译链接运行)一口气讲透

    (动态库与主程序) 机制 作用域查找 + 非虚(无 vtable) 弱符号 vs 强符号 预加载库先解析同名符号 是否依赖弱符号 否 是(libstdc++ 默认全局 new 为 weak) 否(依赖...编译期(静态绑定) 链接期(符号强弱覆盖) 运行期(动态装载器优先级) 作用范围 仅该类/基类查找链 全局(除已绑定到类内的 new) 全局(动态库与主程序) 机制 作用域查找 + 非虚(无 vtable.../app 动态装载器 ld.so 加载顺序: 1) 先装载 LD_PRELOAD 指定的 so(优先级最高) 2) 再装载主程序与其依赖的其它 so(libc, libstdc++, ...)...符号解析: 当需要解析 "malloc/free/new/delete" 时 ├─ 如果在预加载的 tcmalloc.so 中已定义 → 直接绑定到 tcmalloc 版本 └─ 否则继续在后续库中查找...dlopen方式加载 动态库 • src/memory/common/GlobalMemoryAllocator.cc static void loadMemoryAllocatorLib() void

    14110

    详解动态链接库(Dynamic Library )和静态链接库(Static Library)

    3.Main2.c通过翻译器转换成可重定位的目标文件main2.o4.当链接器ld运行时,它判定main2.o运用了addvec.o定义的向量加符号,所以,复制addvec.o到可执行文件prog2。...(图片来自《深入理解计算机系统》第7章)我们可以看到还没链接的“可重定位的目标文件”还是比较散装的,地址从0开始,存在一些未定义符号的空洞;而经过了链接器处理得到的”完全链接的可执行目标文件”,则拥有了真实的虚拟地址...,同时sum等未定义符号的空洞也得到了填充。...其后动态链接库技术一直占据主导地位。2....加载器加载和运行可执行文件时:1.通过.interp节发现动态链接器的路径名2.加载和运行动态链接器动态链接器执行下面的重定位完成链接任务:1.重定位各so的文本和数据到各个内存段2.重定位可执行文件中所有对

    79510

    2017 深度学习框架发展大盘点——迎来 PyTorch,告别 Theano

    在 2017 年,开发团队不断为 TensorFlow 引入新的功能:年初发布 TensorFlow 1.0,实现对 Keras 的全面支持;年底引入 Eager Execution 动态图机制,让开发变得更加简单和直观...对于 Theano 的退出,有开发者这样评价,「它开启了基于符号运算的机器学习框架的先河,然后随着 TensorFlow 和 PyTorch 的崛起,完成自己的历史任务。」...而在任意一个框架上训练的神经网络模型,无法直接在另一个框架上用。开发者需要耗费大量时间精力把模型从一个开发平台移植到另一个。这导致效率的降低以及进度延迟。...GitHub 地址:https://github.com/keras-team/keras 微软携手亚马逊推出 Gluon 深度学习库,全面支持符号式和命令式编程 ?...2017 年 10 月,微软携手亚马逊推出全新 Gluon 深度学习库。它是一个支持符号式和命令式编程的 API,在创造深度学习模型的过程中能极大的简化进程,而不会使训练速度减慢。

    1.5K60

    一种Android App在Native层动态加载so库的方案

    然而对于功能实现的so库,是通过JNI层so库被Java层间接引用的,自身没有直接与Java层对接的JNI函数。所以对于功能实现so库,无法再使用Java层动态加载的方法。...so库被调用时动态加载,结束调用时动态卸载,也能一定程度上减少so库加载需要的常驻内存。 2....这三个函数均在头文件中定义,它们的作用分别是:dlopen()打开一个动态链接库,返回一个动态链接库的句柄;dlsym()根据动态链接库句柄和符号名,返回动态链接库内的符号地址,这个地址既可以是变量指针...一般使用的加载模式有两个:RTLD_NOW在返回前解析出所有未定义符号,如果解析不出来,dlopen()返回NULL;RTLD_LAZY则只解析当前需要的符号(只对函数生效,变量定义仍然是全部解析)。...dlopen函数的使用需要兼容C++ dlopen、dlclose、dlsym函数是C语言库里面的函数,自身是没有考虑到C++的支持的,调用dlopen无法直接加载C++的类及其成员函数。

    8.4K60

    CSAPP---第七章-链接

    链接器维护一个可重定位目标文件的集合E,这个集合中的文件会被合并起来形成可执行文件。 一个未解析的符号集合U,即引用了但是尚未定义的符号集合。 一个在前面输入文件中已经定义的符号集合D。...当加载器加载和运行可执行文件 prog2 时,加载部分链接的可执行文件 prog2。...---- 运行时动态链接和加载某个共享库 应用程序还可能在它运行时要求动态链接器加载和链接某个共享库,而无需在编译时将那些库链接到应用中。 动态链接是一项强大有用的技术。...而由于是共享的,每个动态链接库代码段的内容是完全一样的(代码段可以通过内存映射完成多进程间共享),这样只能在数据段做手脚了,因为数据段不是只读的,无法共享。...glibc动态库内,所以在编译和链接阶段,链接器无法知知道进程运行起来之后printf函数的加载地址。

    1.5K10

    详解动态链接库(Dynamic Library )和静态链接库(Static Library)

    3.Main2.c通过翻译器转换成可重定位的目标文件main2.o 4.当链接器ld运行时,它判定main2.o运用了addvec.o定义的向量加符号,所以,复制addvec.o到可执行文件prog2。...(图片来自《深入理解计算机系统》第7章) 我们可以看到还没链接的“可重定位的目标文件”还是比较散装的,地址从0开始,存在一些未定义符号的空洞; 而经过了链接器处理得到的”完全链接的可执行目标文件”,则拥有了真实的虚拟地址...,同时sum等未定义符号的空洞也得到了填充。...其后动态链接库技术一直占据主导地位。 2....加载器加载和运行可执行文件时: 1.通过.interp节发现动态链接器的路径名 2.加载和运行动态链接器 动态链接器执行下面的重定位完成链接任务: 1.重定位各so的文本和数据到各个内存段 2.重定位可执行文件中所有对

    37710

    图森未来-算法后端平台二面(pass)

    2、C++的中用什么管理项目,CMake或者Make,用CMake或者Make管理项目的好处? 3、你认为DJL与Pytorch、Tensorflow之类的有什么区别?...图森未来-算法后端平台二面(pass) 1、动态链接与静态链接之间的区别? 动态链接和静态链接是两种不同的链接方式,它们之间的主要区别在于代码的加载时间和内存使用方式。...而动态链接则在编译的时候不直接拷贝可执行代码,而是通过记录一系列符号和参数,在程序运行或加载时将这些信息传递给操作系统,操作系统负责将需要的动态库加载到内存中,然后程序在运行到指定的代码时,去共享执行内存中已经加载的动态库可执行代码...内存使用:静态链接的程序体积会相对大一些,如果静态库有更新的话,所有可执行文件都得重新链接才能用上新的静态库。而动态链接则允许多个程序共享同一段代码,而不需要在磁盘上存储多个拷贝。...由于是运行时加载,可能会影响程序的前期执行性能。 2、C++的中用什么管理项目,CMake或者Make,用CMake或者Make管理项目的好处?

    53710
    领券