首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

含大量图文解析及例程 | Linux的ELF文件、链接、加载

Linux的运行库glibc为例,所谓的入口函数,其实 就是指ld 默认的链接脚本所指定的程序入口_start (默认情况)。...大家注意,这里还多了一个奇怪的家伙:解释器,interpreter /lib64/ld-linux-x86-64.so.2。 实际上,它就是动态链接文件的链接加载器。...也就是说,在动态链接的可执行文件中,第一条指令应该在链接加载器 ld 中。我们接下来还是通过readelf -h和gdb来验证一。...而在链接静态时,链接器会把静态中的目标文件取出来和可执行文件真正链接在一起。 静态链接后,指令由相对地址变为绝对地址,各段的加载地址定死了。...另一个好处就是使用静态只需写一个文件名,而不需要写一长串目标文件名。 5T技术资源大放送!包括但不限于:C/C++,Arm, Linux,Android,人工智能,单片机,树莓派,等等。

1.4K22

linux 动态加载_linux默认动态加载路径

当我们在linux系统引用动态时,经常会遇到一个问题,加入我们需要的动态没有在系统的默认目录下,我们编译时使用-L指定了动态的路径,编译时没有问题,但是执行调用该动态的可执行文件时,却提示找不到动态...library version %s\n”, TF_Version()); return 0; } 程序编译及结果如下: 可见程序编译没有问题,但是当执行可执行程序时,出现如下结果: 程序提示加载动态失败...,使用ldd命令查看一: 为什么我们编译的时候明明指定了动态的路径,而且程序编译的时候没有问题,执行的时候却找不到了呢?...解决办法,使用-Wl,-rpath 所需动态的路径 告诉程序如果在默认路径找不到所需动态,则去当前指定的路径找动态。...修改gcc编译指令后,结果如下: 可见,动态加载成功,程序运行成功,问题解决。 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

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

    含大量图文解析及例程 | Linux的ELF文件、链接、加载(中)

    现代操作系统如何装载可执行文件 给进程分配独立的虚拟地址空间 将可执行文件映射到进程的虚拟地址空间(mmap) 将CPU指令寄存器设置到程序的入口地址,开始执行 可执行文件在装载的过程中实际上如我们所说的那样是映射的虚拟地址空间...总体来说,在程序加载过程中,磁盘上的可执行文件,进程的虚拟地址空间,还有机器的物理内存的映射关系如下: Linux的装载过程 接下来我们进一步探究一Linux是怎么识别和装载ELF文件的,我们需要深入...下图是Linux内核代码中与ELF文件的装载相关的一些代码: /fs/binfmt_elf.c中 Load_elf_binary的代码走读: 检查ELF文件头部信息(一致性检查) 加载程序头表(可以看到一个可执行程序必须至少有一个段...,加载 a.out 执行 我们同样以刚才介绍静态链接时的a.c、b.c、main.c的例子来看一静态链接的可执行文件加载。...Linux环境的动态链接对象都是以.so为扩展名的共享对象(Shared Object)。 真的是动态链接的吗?

    3.1K21

    含大量图文解析及例程 | Linux的ELF文件、链接、加载(上)

    ELF文件详解 ELF文件的三种形式 在Linux,可执行文件/动态文件/目标文件(可重定向文件)都是同一种文件格式,我们把它称之为ELF文件格式。虽然它们三个都是ELF文件格式但都各有不同。...共享(shared)目标文件:通常是.so动态链接文件或者动态链接生成的可执行文件。一种特殊类型的可重定位目标文件,可以在加载或者运行时被动态地加载进内存并链接。...其实还有一种core文件,也属于ELF文件,在core dumped时可以得到。我们这里暂且不提。 注意:在Linux中并不以后缀名作为区分文件格式的绝对标准。...如果用于加载执行(可执行目标文件),则加载器则将把elf文件看作是程序头表描述的段的集合,一个段可能包含多个节,节头部表可选。 如果是共享目标文件,则两者都含有。...因为链接器在链接的时候需要节头部表来查看目标文件各个 section 的信息然后对各个目标文件进行链接;而加载器在加载可执行程序的时候需要程序头表 ,它需要根据这个表把相应的段加载到进程自己的的虚拟内存

    3.4K52

    Android 开发中如何动态加载 so 文件

    我想对于静态加载 so 文件,大家都已经很熟悉了,这里就不多说了。...动态加载的优点 静态加载,不灵活,apk 包有可能大。所以采用动态加载 so 文件,有以下几点好处: 灵活,so 文件可以动态加载,不是绑定死的,修改方便,so 有问题,我们可以动态更新。...so 文件很大的话,采用动态加载可以减少 apk 的包,变小。 其实我们常用第三方 so ,单个可能没问题,如果多个第三方 so 文件,同时加载可能会出现冲突,而动态加载就能够解决这一问题。...注意路径陷阱 动态加载 so 文件,并不是说可以把文件随便存放到某个 sdcard 文件目录下,这样做既不安全,系统也加载不了。...so 文件 复制到可加载使用的包路径后,配置完 gradle 之后,就可以使用 load API 调用了。

    5.2K101

    linux如何查看so加载_cmake生成静态

    Linux程序运行找不到动态.so文件的三种解决办法 方法一:添加环境变量 子招数1. 添加当前用户当前终端的环境变量-临时 export LD_LIBRARY_PATH=/home/czd/......#.so file path 使其生效 source /etc/profile 如不能生效,请重启 方法二:复制so文件到lib路径 linux系统的so一般存储与“/usr/lib/”路径中,可将动态复制到该路径中...进入目录内,创建*.conf文件,文件名随意,扩展名必须为.conf cd /etc/ld.so.conf.d/ vim libmy.conf 步骤4....在文件内部,添加so的路径,保存并退出 /home/czd/eclipse-workspacee/calllib/Debug 步骤5....执行命令时期生效 sudo ldconfig 程序在运行时寻找so就会到添加的目录中寻找。 原创文章,转载请注明出处 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。

    5.5K30

    Linux文件制作方法详解

    大家好,继上节,这节我们继续讲解如何Linux系统上创建我们需要的文件 在创建程序之前,需要先来了解GCC的一些参数,因为静态和共享需要GCC工具产生,并且两者的GCC参数不同...:$LD_LIBRARY_PATH 3.另外还可以在/etc/ld.so.conf文件里加入我们生成的的目录,然后/sbin/ldconfig /etc/ld.so.conf是非常重要的一个目录,里面存放的是链接器和加载器搜索共享时要检查的目录...,默认是从/usr/lib /lib中读取的,所以想要顺利运行,我们也可以把我们的目录加入到这个文件中并执行/sbin/ldconfig 动态加载 上面共享的调用属于动态链接方法,此外我们还可以动态加载...动态加载需要用到系统API函数 接口 描述 dlopen 打开对象文件,可被程序访问 dlsym 获取执行了dlopen函数的对象文件中的符号的地址 dlerror 返回上一次出现的错误 dlclose...结束语 到目前为止,我们详细讲解了Linux制作静态、共享、以及动态加载,希望通过此文对你在Linux的认识有所帮助,那么目的就达到了

    2.1K30

    Linux如何in-place更改文件

    导言 前几天下班在地铁上,听到身边有两个小伙子在讨论,如何in-place的修改一个文件,路上想了半天没有好的办法。等到了家里一番探究,终于找到可行的方案了。...什么是in-place的更改文件 所谓edit in place,顾名思义,就是当我们更改一份文件时,不可以创建任何的中间/临时文件,或者临时内存等,来完成对一份文件的修改。...一个类似的例子,用过linux的话,大家应该都有用过vi/vim去修改一份文件,看起来的行为是直接打开一份文件,然后修改,然后wq保存退出。...但是如果有朋友做过监听文件变更的功能的话,会注意到vim在变更文件时,悄悄地去生成了一份隐藏的临时文件,存储了一些中间的变更的数据并在之后再写回到源文件。其实是差不多的道理。...如何做到 那么,我们到底能不能in place的更改一份文件呢?当然是可以的,我们可以使用mmap。

    2.7K51

    Linux如何使用Vim加密文件

    Vim 是一种流行的、功能丰富的和高度可扩展的 Linux 文本编辑器,它的一个特殊功能便是支持用带密码各种的加密方法来加密文本文件。...本文中,我们将向你介绍一种简单的 Vim 使用技巧:在 Linux 中使用 Vim 对文件进行密码保护。我们将向你展示如何让一个文件在它创建的时侯以及为了修改目的而被打开了之后获得安全防护。...系统 $ sudo yum install vim          #RHEL/CentOS 系统 $ sudo dnf install vim          #Fedora 22+ 怎样在 Linux...下次你想打开它编辑一,你就必须像这样去输入密钥: $ vim file.txt 需要 "file.txt" 的加密密钥 警告:正在使用弱加密方法;参见 :help 'cm' 输入密钥:******...文章中我们介绍了怎么通过 Linux 的 Vim 文本编辑器来给一个文件做加密防护。 永远记住要用强加密方式及密码来适当的保护那些可能包含了诸如用户名及密码、财务账户信息等机密信息的文本文件

    1.9K10

    linux如何文件内容,linux用命令修改文件内容

    linuxvi命令修改文件及保存的使用方法 进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi n filename :打开文件,并将光标置于第n行首 vi filename...:打开文件,并将光标置于一行首 v … (转)linuxvi命令修改文件及保存的使用方法 进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首.../article/details/35834703 echo “Raspberry” > test.txt linuxsed命令对文件执行文本替换 让我们看一 sed 最有用的命令之一,替换命令.使用该命令...,可以将特定字符串或匹配的规则表达式用另一个字符串替换.下面是该命令最基本用法的示例: $ sed -e ‘s/foo/bar/’ myfi … linux查看和修改文件时间 一.查看文件时间及相关命令...语法:touch [选项] 文件linuxsed批量替换文件内容 在linux超级终端下编辑文档是件比较麻烦的事情,下面简单介绍一如何linux批量替换文件内容 linuxsed 批量替换多个文件中的字符串

    8.7K20

    Linux静态与动态加载

    查看文件链接的标准:ldd 这就是链接的c标准,我们查一这个文件libc.so.6: 没错,libc.so.6是一个软链接文件,我们再来查看一这个目标文件文件类型,使用file命令:  可以发现它是一个共享的...在Linux当中,以.so为后缀的是动态,以.a为后缀的是静态。 在Windows当中,以.dll为后缀的是动态,以.lib为后缀的是静态。 认识了动态,那静态,又是什么呢?...注意上面我打包了两个,虽然看后缀一个静态,一个动态,但是其实上述的都是静态linux不是单单通过后缀来判断一个的类型,下面就来看看如何真正打包一个动态吧。...gcc -fPIC -c test2.c test3.c -fPIC作用于编译阶段,告诉编译器产生与位置无关的代码,此时产生的代码中没有绝对地址,全部都使用相对地址,从而代码可以被加载加载到内存的任意位置都可以正确的执行...这正是共享所要求的,共享加载时,在内存的位置不是固定的。

    17010

    linux系统如何管理文件的?

    好了,废话不多说,进入今天的主题-------linux系统如何管理文件系统?...二、inode结构体: 1、在讲这个之前,我想接触过Linux的好友,都会听过这句话:在linux系统,一切都是文件。...这个确实是,怎么讲,不知道你有没有注意,在windows,我们可以看到硬盘分区:C盘、D盘、E盘等,但是你在linux,你是看不到这样的分盘标识符的。...inode (index node) 表中包含文件系统的所有文件列表 3、在linux系统,操作系统最初拿到的信息是文件名,最终得到的是文件内容。...三、vnode结构体: 1、在讲这之前,我们还是要讲一什么是文件描述符,前面的文章我只是简单的讲了一,这里还是补充一: a、文件描述符(fd)的本质是一个数字,这个数字本质上是进程表中文件描述符表的一个表项

    1.8K20

    linux如何实现快速拷贝大文件

    拷贝数据 远程拷贝数据的时候,我们一般使用rsync命令,但是如果拷贝大量的小文件,会导致rsync的传输速度慢。...使用tar pv lz4打包压缩传输,可以解决这问题,使用这个方法,等同于使用scp、rsync传输大文件。...实测,使用rsync传输1200G,单个文件大小为几十KB~2GB,千兆网卡,需要同时跑6个rsync才能把带宽跑满,每个速度20MB左右,速度波动大。每分钟可以拷贝4.5GB左右。...,u是更新传输,源文件修改时间较新,则传输。...注意:rsync 传输文件夹时候,folder/ 带/则是传输目录下的文件,不带/是把文件夹也传输过去。 使用压缩传输 安装pv、lz4工具 注意:服务器两端都要安装。

    9.1K40

    Linux动态链接加载路径及搜索路径问题

    (2)ldd是查看可执行文件中所依赖的的程序,比如想查main程序用到了那些动态,可以直接 ldd main (3)ldconfig用来更新文件/etc/ld.so.conf的修改生效。...如:nm /lib/libc*.so Linux 动态链接搜索路径问题 Linux动态链接的搜索路径按优先级排序为: 1.编译目标代码时指定的动态搜索路径; 在编译时通过gcc 的参数”-Wl,...ld.so.conf.d/*.conf 因此,最优雅的方式是在ld.so.conf.d目录下创建一个你的程序依赖的配置文件,配置文件内容为程序依赖的动态链接的路径,一个路径一行。...这个文件的内容可以通过 /etc/ld.so.conf 来指定;这个是比较固定的机制,对全局所有用户都有影响;不过更改设置后需要 root 调用 ldconfig 来刷新一。...总结 以上所述是小编给大家介绍的Linux动态链接加载路径及搜索路径问题,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对ZaLou.Cn网站的支持!

    10.2K63

    JVM如何加载.class文件

    JVM 中类的装载是由类加载器(ClassLoader)和它的子类来实现的,Java 中的类加载器是一个重要的Java 运行时系统组件,它负责在运行时查找和装入类文件中的类。...由于Java 的跨平台性,经过编译的Java 源程序并不是一个可执行程序,而是一个或多个类文件。当Java 程序需要使用某个类时,JVM 会确保这个类已经被加载、连接(验证、准备和解析)和初始化。...类的加载是指把类的.class 文件中的数据读入到内存中,通常是创建一个字节数组读入.class 文件,然后产生与所加载类对应的Class 对象。...类的加载首先请求父类加载加载,父类加载器无能为力时才由其子类加载器自行加载。JVM 不会向Java 程序提供对Bootstrap 的引用。...下面是关于几个类加载器的说明: • Bootstrap:一般用本地代码实现,负责加载JVM 基础核心类(rt.jar); • Extension:从java.ext.dirs 系统属性所指定的目录中加载

    1.1K00

    Linux如何快速删除大量碎小的文件

    XX系统,通过FTP给客户实时传送文件,正常逻辑是客户收到文件后,自动删除FTP服务器上的本地文件,但经常出现文件已经推送了,客户没删除文件的情况。...你可能会说,删了啊,确实应该删了,但是小文件多了,会产生什么影响?如果直接rm,你认为行么? Linux文件系统容量分为大小容量和inode容量,前者限制大小,后者限制数量。...这里提一./*的工作原理,他将目录下所有文件名串接到rm -rf后边。像这样: rm -rf a b c d e f ... 如上,这是一条shell指令。...不幸的是无论unix,还是linux,都对单条命令长度有最大限制。 AIX操作系统受参数ARG_MAX的限制,getconf arg_max查询。...Linux操作系统受参数LINE_MAX的限制,getconf line_max查询。 这就是文件太多的时候,为什么rm -rf ./*会报错的缘故。

    7.5K50
    领券