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

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

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

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

    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

    1.9K90

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

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

    57410

    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 中的函数)。

    86110

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

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

    53110

    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.4K80

    详解动态链接库(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.重定位可执行文件中所有对

    39610

    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.4K60

    一种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.1K60

    CSAPP---第七章-链接

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

    1.2K10

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

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

    35710

    Rust-ABI 的前世今生

    因为链接器并不会关心代码里的类型,它只看符号。而未定义行为并不会破坏符号,比如 do_stuff 函数。 ABI 的核心问题是,它将最终二进制文件中的符号名称与给定的语义集紧密联系在一起。...Swift 通过引入一种叫做弹性类型(Resilience Type)[2]的东西,可以实现数据结构变化时保证 ABI 兼容,具体来说,对于动态链接库,只有在运行时才能向 dylib 得知类型的具体大小...稳定的 ABI 可以支持 Rust crates 之间的动态链接,从而允许 Rust 程序支持动态加载的插件(C/C++ 中常见的功能),也允许 Rust 库可由其他语言(比如 Swift)加载。...Foo_u64,将其编译为动态库(比如 .so)并不会包含Foo的泛型定义,如果对于使用Foo_u32的库来说,就无法动态链接了。...在这之前,他一直认为即使Rust的ABI不稳定,只要库和主二进制文件是用相同的编译器以及std等等版本编译的,就可以安全地动态加载一个库。

    1.8K20

    静态链接库和动态链接库的区别

    动态链接库的加载方式有两种:隐式加载和显示加载。注意:linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接(见本文第四部分)。...lib,/usr/libflag表示在什么时候解决未定义的符号(调用)。...取值有两个:1) RTLD_LAZY : 表明在动态链接库的函数代码执行时解决。2) RTLD_NOW : 表明在dlopen返回前就解决所有未定义的符号,一旦未解决,dlopen将返回错误。...4.2、显加载示动态链接库的实例在下面这个实例中将通过动态加载libmymath.so链接库,来调用add()和sub()两个函数。...库既可以是静态库也可以是动态的常见的三种符号:①在库中被调用,但没有在库中定义(表明需要其他库支持),用U表示②在库中定义的函数,用T表示③“弱态”符号,他们虽然在库中被定义但是可能被其他库中同名的符号覆盖

    9.3K21

    如何避免 JavaScript 模块化中的函数未定义陷阱

    函数是在模块作用域内定义的,浏览器无法找到它,因此会抛出未定义的错误。...动态导入:在某些情况下,可能需要使用 import() 函数进行动态导入,这会返回一个 Promise,适用于按需加载或惰性加载场景。 // 动态导入 import('....模块化后,这些外部库可能不会自动成为全局对象的一部分,从而导致依赖于全局变量的代码无法正常工作。...例如,使用 jQuery 时,$ 符号在模块化后可能无法访问: // script.js (非模块化) $(document).ready(function() { console.log('jQuery...清晰的文档可以帮助团队成员快速理解模块之间的关系和使用方法。 在模块化 JavaScript 项目时,除了常见的函数未定义问题,还可能面临事件监听、外部库加载、依赖管理等挑战。

    2.2K10

    调查报告:DLL项目运行时库设置与依赖兼容性分析

    项目时,将所有相关依赖以 /MT 方式引入,但这导致编译失败,错误信息包括“RuntimeLibrary”不匹配(如 MD_DynamicRelease 与 MT_StaticRelease 冲突)以及无法解析的外部符号.../MD:多线程动态运行时库,C++运行时库动态链接为DLL(如 msvcr*.dll),在运行时加载。标准做法是:静态库(.lib)通常使用 /MT,因为它将运行时库包含在库中,适合独立编译。...动态库(DLL)通常使用 /MD,因为DLL需要在运行时加载,必须与应用程序共享运行时库。问题分析1....DLL项目为何必须使用 /MDDLL在运行时由应用程序加载,必须使用 /MD 以确保与应用程序的C++运行时库兼容。...例如,Abseil库的符号(如 absl::lts_20250127::RFC3339_full)未定义,可能因为 /MT 静态库未正确链接到 /MD DLL。4.

    70800

    探秘 Mach-O 文件

    dyld 加载的标志 MH_NOUNDEFS 目标文件没有未定义的符号, MH_DYLDLINK 目标文件是动态链接输入文件,不能被再次静态链接, MH_SPLIT_SEGS 只读 segments..., LC_UUID 二进制文件 id,与符号表 uuid 对应,可用作符号表匹配, LC_LOAD_DYLINKER 启动动态加载器, LC_SYMTAB 描述在 __LINKEDIT 段的哪找字符串表...dyld_stub_binder 进行相关绑定,而 __nl_symbol_ptr 中的数据就是在动态库绑定时进行加载。...[1240] 所以 __la_symbol_ptr 中的数据在初始状态都被 bind 成 stub_helper,接着 dyld_stub_binder 会加载相应的动态链接库,执行具体的函数实现,此时...= KERN_SUCCESS) { break; } } 符号化 符号化地址的大致思路分三步:1. 获取地址所在的内存镜像;2. 定位到内存镜像的符号表;3.

    2.5K30
    领券