首页 > 其他分享 >编译链接概念,VMA/LMA是什么

编译链接概念,VMA/LMA是什么

时间:2023-09-28 18:55:24浏览次数:43  
标签:文件 输出 VMA 编译 地址 LMA 链接 加载

编译基础概念

为了描述链接器脚本语言,我们需要定义一些基本概念和词汇。

链接器干的主要事情就是把输入文件整合成一个输出文件。那么输入是什么?输出是什么?怎么整合?整合的是什么信息?

输入和输出文件都是object文件格式。它们都称为目标文件。输出文件又称为可执行文件。它们的内容格式类似,都有很多的sections

一个节可能被标记为loadable,这意味着应该将内容加载到内存中,输出文件才能运行起来。没有内容的部分可能是allocatable,这意味着应该留出内存中的一个区域,但不应该在那里加载任何特定内容(在某些情况下,必须将该内存清零)。既不可加载也不可分配的部分通常包含某种调试信息。

每个loadable or allocatable的输出部分都有两个地址。第一个是VMA或虚拟内存地址。这是运行输出文件时该节将具有的地址。第二个是LMA或加载存储器地址。这是加载节的地址。在大多数情况下,这两个地址将是相同的。它们可能不同的一个例子是,将数据段加载到ROM中,然后在程序启动时复制到RAM中(这种技术通常用于在基于ROM的系统中初始化全局变量)。在这种情况下,ROM地址将是LMA,而RAM地址将是VMA。

每个对象文件都有一个符号列表,称为符号表。符号可以定义也可以未定义。每个符号都有一个名称,每个定义的符号都有地址以及其他信息。如果您将一个C或C++程序编译到一个对象文件中,您将为每个定义的函数和全局或静态变量获得一个定义的符号。输入文件中引用的每个未定义函数或全局变量都将成为未定义符号。

使用objdump -h命令可以查看section的信息。
使用nm或者objdump -t可查看符号表的信息。

所以上面的问题可以简单回一下。
输入和输出文件都是object类型的文件。链接器把输入文件的相同section进行合并,不同的section继续保留。

https://sourceware.org/binutils/docs/ld/Basic-Script-Concepts.html

Ref

GCC链接脚本帮助文档:https://sourceware.org/binutils/docs/ld/Scripts.html

标签:文件,输出,VMA,编译,地址,LMA,链接,加载
From: https://www.cnblogs.com/lvzh/p/17736342.html

相关文章

  • 源码编译nginx安装脚本
    #!/bin/bashprofile(){echo"installingrelyon...."yum-yinstallgccgcc-c++pcrewgetopensslopenssl-devellibtoolgdgd-develecho"dowloadnginx_1.18......"cd/usr/local/src&&wgethttps://nginx.org/download/nginx-1.......
  • vmare平台上esxi主机,搭建虚拟机ping不通网关
    环境描述:虚拟化平台:vmare5.5物理机系统:esxi虚拟机:centos7.5交换机2台:锐捷和华为机柜位置–》上面的交换机是华为的26机柜1台物理机ip10.1.1.1机柜位置–》上面的交换机是锐捷的12机柜3台物理机IP10.1.1.210.1.1.310.1.1.4物理机插了2个网线,a网线是物理机-管理网10.1.1.......
  • Linux中C程序的编译与运行
    C程序编译的完整过程如下图所示1、编译C文件,生成可执行文件gccmine.c-omine2、运行程序./mine3、编译并运行gccmine.c-omine&&./mine4、编译C程序,生成目标文件gcc-cmine.c-omine.o5、链接目标文件,生成可执行文件,同编译C文件一样。gccmine.o-omine......
  • mojo编程语言:编译后的mojo二进制执行文件调用python库报错——设置MOJO_PYTHON_LIBRAR
    代码:frompythonimportPythonfnf()raises:#ThisisequivalenttoPython's`importnumpyasnp`letnp=Python.import_module("numpy")leta=np.array([1,2,3])print(a)fnmain()raises:f() mojo编译后执行,报错:Moj......
  • 利用gpt_agent解决svn每次编译执行的时候都要输入密码的问题
    每次利用svn执行命令的时候总是需要输入密码,尤其是在工程的打包的时候,要输入很多次,非常麻烦。在参考了一些文章之后,感觉或多或少有些杂乱,总结了一下流程,大致如下。 1、在配置文件 ~/.subversion/config 里面的 [auth] 部分添加(或修改)以下代码:1[auth]2passwor......
  • 使用idea自带的反编译工具 [FernFlower]
    终端直接输入命令java-cp参数1org.jetbrains.java.decompiler.main.decompiler.ConsoleDecompiler-dgs=true参数2参数3参数说明:参数1。IDEA安装目录下的反编译插件“java-decompiler.jar”所在路径,需要加上双引号。示例:"E:\IntelliJIDEA2020.2.2\plugins\java-decomp......
  • [转载] linux下 GCC编译链接静态库&动态库
    转载自:https://www.cnblogs.com/thechosenone95/p/10605172.html#_label0静态库有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库,我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后要讲到的environ变量)。......
  • 代码检查过程中为什么需要涉及到编译呢?
    本文分享自华为云社区 《代码检查过程中为什么需要涉及到编译呢?》,作者:gentle_zhou。随着大家对软件安全越来越重视,在编码阶段针对源码安全的保障也被各行各业企业研发测试运维团队与个人开发者越来越频繁的被提及,其中静态代码检查SAST工具尤为突出。SAST代码检查服务作为一款可......
  • 龙芯编译libiconv
    系统版本:4.19.0-loongson-3-desktop loongarch64GNU/Linux 编译renderdoc时报错/usr/bin/ld:找不到-liconv,需手工下载libiconv代码编译:wgethttps://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.15.tar.gztar-zxvflibiconv-1.15.tar.gzcdlibiconv-1.15/./config......
  • goland编辑器编译的时候报错package xxx is not in GOROOT的原因排查
    先介绍下,我的目录部署情况1、GOROOT=C:\ProgramFiles\Go(我的golang环境装在c盘的)2、GOPATH=E:\Go(项目目录我放在E盘的)3、GO111MODULE=auto(默认值,没有改过)4、GOVERSION=go1.20.6(我的golang版本)5、项目结构,遵循官方推荐的方式E:\Go——bin——pkg——src 6、本次需要......