首页 > 其他分享 >6.1 静态链接

6.1 静态链接

时间:2023-07-22 16:11:54浏览次数:38  
标签:文件 可重 6.1 符号 静态 模块 定位 链接

像Linux LD程序这样的静态链接器(static linker)以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的、可以加载和运行的可执行目标文件作为输出。输入的可重定位目标文件由各种不同的代码和数据节(section)组成,每一节都是一个连续的字节序列。指令在一节中,初始化了的全局变量在另一节中,而未初始化的变量又在另外一节中。 为了构造可执行文件,链接器必须完成两个主要任务: 1.符号解析(symbol resolution)。目标文件定义和引用符号,每个符号对应于一个函数、一个全局变量或一个静态变量(即C语言中任何以static属性声明的变量)。符号解析的目的是将每个符号引用正好和一个符号定义关联起来。 2.重定位(relocation)。编译器和汇编器生成从地址0开始的代码和数据节。链接器通过把每个符号定义与一个内存位置关联起来,从而重定位这些节,然后修改所有对这些符号的引用,使得它们指向这个内存位置。链接器使用汇编器产生的重定位条目(relocation entry)的详细指令,不加甄别地执行这样的重定位。 目标文件
目标文件有三种形式: 可重定位目标文件。包含二进制代码和数据,其形式可以在编译时与其他可重定位目标文件合并起来,创建一个可执行目标文件。 可执行目标文件。包含二进制代码和数据,其形式可以被直接复制到内存并执行。 共享目标文件。一种特殊类型的可重定位目标文件,可以在加载或者运行时被动态地加载进内存并链接。  符号和符号表 每个可重定位目标模块m都有一个符号表,它包含m定义和引用的符号的信息。在链接器的上下文中,有三种不同的符号: 1.由模块m定义并能被其他模块引用的全局符号。全局链接器符号对应于非静态的C 函数和全局变量。 2.由其他模块定义并被模块m引用的全局符号。这些符号称为外部符号,对应于在其他模块中定义的非静态C函数和全局变量。 3.只被模块m定义和引用的局部符号。它们对应于带static属性的C函数和全局变量。这些符号在模块m中任何位置都可见,但是不能被其他模块引用。  

标签:文件,可重,6.1,符号,静态,模块,定位,链接
From: https://www.cnblogs.com/LCAB/p/17565755.html

相关文章

  • Uncaught AssertionError: Assertion failed. See https://openlayers.org/en/v6.15.1
    openlayers点击具体错误Cannotfitemptyextentprovidedas geometry.这个错误信息意味着OpenLayers在尝试使用一个空的范围作为几何图形时出现了问题。范围(extent)表示几何图形覆盖的边界框或区域,它由四个坐标值组成:最小经度、最小纬度、最大经度和最大纬度。当范围没有......
  • android studio 不混淆 静态方法
    AndroidStudio不混淆静态方法的实现作为一名经验丰富的开发者,我将向您解释如何在AndroidStudio中实现不混淆静态方法。下面是实现该目标的步骤:步骤操作1打开Proguard文件2配置Proguard规则3构建和运行应用接下来,我将解释每个步骤需要做什么,并提供代码示......
  • nesp华为设备模拟器-->静态路由两个网段互联
    静态路由配置,需求如下,PC2需要访问Server1服务器。 软件安装:我下载的是hwmnqensp.rar这个安装包,他是一个整体,不像官网下载那么多包。分析:这里client终端和server服务器,自行配置ip、掩码和网关,LSW二次交换机无需配置;AR1和AR4为路由器,所以需要配置。基础命令:进入用户视图<......
  • C# 使用Socket实现长链接和短连接
    直接上代码服务端:usingSystem;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;usingSystem.Threading;usingSystem.Threading.Tasks;usingSystem.Windows;namespaceSocketServer{///<summary>///MainWindow.xaml的交互逻辑///......
  • 链接参数export dynamic和-rdynamic的使用
    存在程序main通过dlopen使用libA中的符号:main.c:1#include<stdio.h> 2#include<dlfcn.h> 3  4typedefvoid(*func)(void);  5  6  7voidtest_main() 8{ 9  return;10}11 12 13intmain()14{15  void*handle=dlopen("./libA.so",RTLD_N......
  • jsp 超链接带系统前缀
    如: <a href="www.iteye.com">iteye</a> 网页生成后点击此超链接,始终有如http://localhost:8080的前缀,变成http://localhost:8080/www.iteye.com  解决:加上http://前缀   <a href="http://www.iteye.com">iteye</a> ......
  • tp6生成链接内容二维码
    1.composer安装composerrequireendroid/qr-code2.相关类的引用useEndroid\QrCode\Color\Color;useEndroid\QrCode\Encoding\Encoding;useEndroid\QrCode\ErrorCorrectionLevel\ErrorCorrectionLevelLow;useEndroid\QrCode\QrCode;useEndroid\QrCode\L......
  • HTTP长连接与短链接
    随着Web应用的越来越流行,人们对一些实时性功能的需求越来越高,比如互动聊天、即时通讯等。技术人员开始关注如何高效的实现以支持日以壮大的用户量和并发性能的要求。什么是HTTP长连接、短连接?在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建......
  • Linux 静态库的创建和使用
    参考文章:《【Linux】静态库和动态库的创建与使用--示例讲解》 一、库的种类Linux下的库有两种:静态库和动态库(共享库);静态库:程序在编译链接的时候把库的代码链接到可执行文件中,.a为后缀动态库:程序在运行的时候才去链接动态库(共享库)的代码,可以多个程序共享使用库的代码,通......
  • 静态方法中创建的对象java
    静态方法中创建对象的流程为了在静态方法中创建对象,我们需要按照以下步骤进行操作:步骤操作1.在静态方法中创建一个新的对象2.设置对象的属性3.返回创建的对象现在让我们逐步实现这些步骤。步骤1:在静态方法中创建一个新的对象首先,我们需要在静态方法中创......