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

使用带16位x86的GNU LD时,相对地址不正确

是指在使用GNU LD链接器时,相对地址的计算出现了错误。

链接器(Linker)是编译过程中的最后一步,它负责将编译好的目标文件以及需要的库文件组合起来生成最终的可执行文件。相对地址是指代码中使用的地址相对于某个基址(如代码段基址、数据段基址等)的偏移量。它在程序执行时用于定位代码或数据在内存中的位置。

出现相对地址不正确的问题可能有多种原因,下面是可能导致这个问题的一些常见因素:

  1. 代码段与数据段交叉:在链接过程中,代码段和数据段的相对地址计算可能发生错误,导致相对地址不正确。
  2. 内存对齐问题:某些情况下,代码或数据在内存中的位置需要按照一定的对齐要求,如果没有正确对齐,相对地址计算可能出错。
  3. 地址重定位表错误:链接器在生成可执行文件时通常会生成一个地址重定位表,用于修正相对地址。如果地址重定位表中的信息错误或缺失,相对地址计算可能出现问题。

为了解决这个问题,我们可以采取以下几个步骤:

  1. 检查代码和数据段的布局:确保代码段和数据段没有交叉,它们在内存中的位置是正确的。
  2. 检查对齐要求:查看编译器和链接器的文档,了解代码和数据在内存中的对齐要求,并按照要求设置合适的对齐方式。
  3. 检查链接器选项:在使用GNU LD时,可以检查链接器的选项是否正确设置,例如是否启用了地址重定位表等。
  4. 检查链接器脚本:链接器脚本是用于指导链接器如何组织代码和数据的配置文件,检查脚本中的相关配置是否正确。

总之,解决相对地址不正确的问题需要仔细检查代码、数据段的布局,对齐要求以及链接器的配置。通过排除可能的因素,逐步调试定位问题,最终修正相对地址计算错误。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

交叉编译学习笔记(一)——交叉编译和交叉工具链

此时编译叫做本地编译,即编译出来程序是由当前目标平台编译出,且只是放到当前平台下运行。 2. 交叉编译 交叉编译是和本地编译相对概念。...交叉编译意义 交叉编译概念一般用于嵌入式系统开发。 使用交叉编译主要原因,是嵌入式系统中配置较低,资源过少,远不及PC编译效率。...) 输出目标: 程序可执行文件 可被其他可执行文件/库文件调用库文件 工具:链接器(ld) 这里有一个不得不提二进制工具集——GNU Binutils。...GNU Binutils,即GNU Binary Utilities简写,是一组二进制工具集合。...主要包含工具有: ld:链接器,将多个目标文件链接成一个可执行文件/目标库文件 as:汇编器,将汇编源代码编译为机器代码 ranlib:对静态库符号索引表进行更新 addr2line:将地址转换为行号

5.4K70
  • 交叉编译环境安装

    什么是交叉编译 我们在Linux中使用自带gcc和g++编译器进行编译程序是针对X86架构。而我们开发板大多都是ARM或者其他架构开发板,我们就需要编译出针对其他架构程序。...其实就是在我们PC(X86)上编译出其他平台上代码,就称它为交叉编译。 想编译出在其它平台上可执行程序,就需要使用不同编译器,因为不同编译器有不同指令集等。...地址:http://releases.linaro.org/ 直达地址: http://releases.linaro.org/components/toolchain/binaries/4.9-2017.01...--with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-objc-gc --enable-shared --without-included-gettext...--with-gnu-as --with-gnu-ld --disable-libmudflap --enable-lto --enable-objc-gc --enable-shared --without-included-gettext

    2.3K10

    TT扩展件microPython实现.2

    选项 说明 -shared 产生共享对象 -static 使用静态链接,默认是动态链接 -e xx 指定xx 为程序入口函数 -fpic 产生地址无关代码,较小且较快,但某些平台会有限制符号数量和代码长度..., -fPIC 产生地址无关代码,没有限制。...在开发一个项目使用了非常多第三方.a静态库文件,导致编译出可执行文件非常大。...,如果带有-Wl,--gc-sections参数,并且之前编译目标文件带有-ffunction-sections、-fdata-sections参数,则链接器ld不会链接未使用函数,从而减小可执行文件大小...这个地方是编译加入库一览 ---- ---- GNU链接器几个开关项解释:-lm -lc -lgcc -lm 代表链接器将连接GCC数学库libm.a -lc 代表链接器将连接GCC标准C

    1.2K30

    交叉编译概念详解

    这种方式下,我们使用 x86 平台上工具,开发针对 x86 平台本身可执行程序,这个编译过程称为本地编译。...平台程序,编译得到程序在 x86 平台上是不能运行,必须放到 ARM 平台上才能运行。...这样软件包需要访问主机和目标编译器,并且需要教它们何时使用它们; Toolchain Leaks:配置不正确交叉编译工具链可能会将主机系统某些位泄漏到已编译程序中,从而导致通常易于检测但难以诊断和纠正故障...Binutils 工具包含子程序如下: ld - GNU 链接器; as - GNU 汇编器; gold - 一个新,更快 ELF 链接器; addr2line -...把地址转换成文件名和所在行数; ar - 用于创建,修改和提取档案实用程序; c ++ filt-过滤以解编码编码 C ++符号; dlltool-创建用于构建和使用 DLL

    3.9K10

    GCC编译选项_需要使用安全编译选项语言

    “/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了(-L指定路径,-l指定具体库,配合使用),比如常用...,比如在我们地PC平台(X86 CPU)上编译出能运行在sparc CPU平台上程序,编译得到程序在X86 CPU平台上是不能运行,必须放到sparc CPU平台上才能运行。...当然两个平台用都是linux。这种方法在异平台移植和嵌入式开发用得非常普遍。 相对与交叉编译,我们平常做编译就叫本地编译,也就是在当前平台编译,编译得到程序也是在本地执行。...用来编译这种程序编译器就叫交叉编译器,相对来说,用来做本地编译就叫本地编译器,一般用都是gcc,但这种gcc跟本地gcc编译器是不一样,需要在编译gcc用特定configure参数才能得到支持交叉编译...交叉编译器使用方法使用方法跟本地gcc差不多,但有一点特殊是:必须用-L和-I参数指定编译器用sparc系统库和头文件,不能用本地(X86)库(头文件有时可以用本地)。

    1.2K20

    Linux编译工具:gcc入门

    什么是gcc gcc全称是GNU Compiler Collection,它是一个能够编译多种语言编译器。...2. gcc特点 gcc是一个可移植编译器,支持多种硬件平台。例如ARM、X86等等。 gcc不仅是个本地编译器,它还能跨平台交叉编译。...所谓本地编译器,是指编译出来程序只能够在本地环境进行运行。而gcc编译出来程序能够在其他平台进行运行。例如嵌入式程序可在x86上编译,然后在arm上运行。...汇编器生成是可重定位目标文件,学过操作系统,我们知道,在源程序中地址是从0开始,这是一个相对地址,而程序真正在内存中运行时地址肯定不是从0开始,而且在编写源代码时候也不能知道程序绝对地址,...gcc可以加上-Wall选项。

    4.7K50

    浅谈Linux动态链接库

    地址无关 无论何种操作系统上,使用动态链接生成目标文件中凡是涉及第三方库函数调用都是地址无关。...这里提到地址指的是进程在内存上虚拟地址。动态链接库函数地址在编译是不确定,在装载,装载器根据当前地址空间情况,动态地分配一块虚拟地址空间。 而静态链接库其实是在编译就确定了库函数地址。...在可执行文件中,printf()函数相对于文件头偏移量是确定,所以说它地址在编译链接后就是确定。...动态链接优缺点 相比之下,动态链接主要有以下好处: 多个可执行文件可以共享使用系统中共享库。每个可执行文件都更小,占用磁盘空间也相对比较小。...当同一个动态链接库有多个不同版本.so文件,可以将他们安装到不同路径下面,然后使用LD_LIBRARY_PATH环境变量来控制使用哪个库。

    9K30

    ARM版Oracle安装包_如何把Linux移植到手机

    今天在这里想做一个笔记,记录一下完整arm64移植过程。 嵌入式Linux系统组成部分 嵌入式Linux移植到开发板上,主要有四个组成部分,下面一 一列举。   ...2、进行交叉编译配置工作   交叉编译意思是在你x86pc上,编译出能够在arm64上运行程序,充当是“翻译”角色。...aarch64-linux-gnu-cpp aarch64-linux-gnu-ld aarch64-linux-gnu-dwp aarch64-linux-gnu-ld.bfd...aarch64-linux-gnu-elfedit aarch64-linux-gnu-ld.gold aarch64-linux-gnu-g++ aarch64-...注意:上一行xxxx为你开发板或MCU原厂名字,如Sumsung或者xilinx。*******.dtb对应你开发板型号。   这也是我推荐使用原厂内核原因。

    3.1K20

    一次搞定 Arm Linux 交叉编译

    为什么要交叉编译 交叉编译其实是相对于本地编译(native build)来说,我相信大家最开始学习 C/C++ 这些语言时候,都是在电脑上写程序,然后在电脑上编译生成可执行文件,最后在电脑上运行。...之所以整个流程变成了这个样子,这是由嵌入式系统特性决定:一般嵌入式系统里面使用芯片性能都比较弱,而且绝大部分都不能像 X86 一样运行 Windows/Ubuntu 桌面系统,即使能运行,性能也很弱...aarch64-linux-gnu-gcc [] 是可选部分。...arm-linux-gnueabi-gcc 和 aarch64-linux-gnu-gcc 适用于 Arm Cortex-A 系列芯片,前者针对 32 位芯片,后者针对 64 位芯片,它使用是 glibc...工具链下载安装 下载地址 现在 Arm 平台上用最广泛工具链是 Linaro 发布,大家可以到 Linaro 官网下载,地址如下: http://releases.linaro.org/components

    28.7K63

    吴章金: 如何创建一个*可执行*共享库

    共享目标文件(.so,共享库),协同可执行文件创建进程映像 Core dump(core),运行过程中崩溃自动生成,用于调试 我们来看中间两类: 可执行文件 如果不引用外部库函数,那么所有符号地址是确定...可执行文件有标准 C 语言程序执行入口 main,而共享库则并没有这类强制要求 后者为了确保可以灵活被多个可执行文件共享,所以,符号地址在链接相对,在装载动态分配和计算符号地址 接下来做个实验具体看看两者区别...如果没有 -rdynamic,链接就没法使用。...,说明库函数解析出了问题,主动用动态连接器跑一下看看: $ /lib/i386-linux-gnu/ld-2.23.so ....\n"); } 当普通共享库使用,默认编译即可,要能够执行的话,实现一下 entry(),编译打开 EXEC_SHARED 即可: $ gcc -m32 -shared -fpic -o libhello.so

    1.1K20

    运行第一个汇编程序

    机器语言和汇编语言之间几个主要区别: 区别 机器语言 汇编语言 表示方式 二进制代码 文本代码 可读性 人类难以理解 相对易读 抽象程度 最低 中等 代码长度 最短 较长 编写难度 最高 较低 直接执行...在centos7 上运行汇编程序 在CentOS 7上运行汇编程序,需要先安装相应汇编器和链接器,例如GNU Assembler (GAS)和GNU Linker (LD)。...可以通过以下命令安装: sudo yum install nasm ld 安装完成后,可以使用文本编辑器编写汇编程序,例如使用vim编辑器: vim hello.asm 参考上面例子 保存文件后,可以使用以下命令编译和链接程序...: nasm -f elf64 -o hello.o hello.asm ld -s -o hello hello.o 编译和链接成功后,可以使用以下命令运行程序: ....Irvine: 这是一本非常受欢迎汇编语言教材,主要讲解基于x86架构汇编语言编程,包括32位和64位编程技术。

    22120

    记 Kylin 麒麟系统安全中心拦截导致 dotnet sdk 找不到 OpenSsl 构建失败

    -linux-gnu$ ls | grep libssl libssl3.so libssl.so.1.1 尝试使用 LD_LIBRARY_PATH 环境变量设置寻找路径,依然没有帮助,依然提示上述错误...通过安同文档可知,只需判断 /lib64 路径下是否只有 ld.so.1 文件即可知道是否旧世界系统 /lib64$ ls ld.so.1 再使用 file 命令查看 dotnet 入口程序文件 file.../lib64/ld.so.1 可以知道龙芯提供 dotnet sdk 也是旧世界。...新世界 dotnet 是在龙芯社区组织里面的,详细请看 https://github.com/loongson-community/dotnet-unofficial-build 以上这些推测都不正确...,我后面在调试别的问题时候,发现了麒麟系统安全中心才发现了核心问题 核心原因是我是使用 ssh 远程过去,麒麟系统安全中心将我 dotnet sdk 运行给拦截了,但是在 SSH 里面啥都没有提示

    10010

    安装GCC-8.3.0及其依赖

    C++由Bjarne Stroustrup(被誉为C++之父)于1979年在新泽西州美利山贝尔实验室开始设计开发,最初命名为C,后来在1983年更名为C++。 2. ...GCC国内镜像下载地址 下载速度不一,请选择速度最快: 1) http://mirrors.nju.edu.cn/gnu/gcc/gcc-8.3.0/ 2) http://mirrors.ustc.edu.cn.../gnu/mpc/ 3) http://mirrors.ustc.edu.cn/gnu/mpc/ 4.4. m4编译工具 本文选择是最新版本m4-1.4.16,下载地址: 1) .../gnu/m4/ 如果使用“--prefix”指定了安装目录,则在编译gmp等之前还需先设置好环境变量PATH,以便configure能找到m4。...设置LD_LIBRARY_PATH 在编译GCC之前,如果不设置LD_LIBRARY_PATH(如果编译gmp没有指定“--prefix”安装,一般不用再显示设置),则可能编译时报“error

    13.6K72

    Arm放弃了自家汇编语法?改投GNU了?

    ,_等(由点、字母、数字、下划线等组成,除局部标号外,不能以数字开头)字符组成,标号后面加“:”。 段内标号地址值在汇编确定; 段外标号地址值在连接确定。 3....宏操作可以使用一个或多个参数,当宏操作被展开,这些参数被相应值替换。...ADR伪指令为小范围地址读取伪指令,使用相对偏移范围:当地址值是字节对齐 (8位) ,取值范围为-255~255,当地址值是字对齐 (32位) ,取值范围为-1020~1020。...使用相对偏移范围:当地址值是字节对齐,取值范围为-64~64KB;当地址值是字对齐,取值范围为-256~256KB 语法格式: ADRL{cond} register,label ADRL...2) bin BIN文件是直接二进制文件,内部没有地址标记。bin文件内部数据按照代码段或者数据段物理空间地址来排列。一般用编程器烧写从00开始,而如果下载运行,则下载到编译地址即可。

    2.2K30

    测评 OrangePi KunPeng Pro走进高校

    当然,其相对较低成本和易于使用特性也使其成为高校师生理想实验和教学平台。...查看openEulerip地址 启动ssh 基于Xshell进行连接 连接系统三要素 ip地址 : 192.168.3.161 用户名:openEuler/root root 为超级管理员.../a.out,观察输出结果,如下所示 2.3.2 x86架构 为对比开发板鲲鹏,特在阿里云购入x86openEuler服务器,进行对比: root@iZbp16djnvbt0u13pkrbckZ...向无符号整型转换 ,又出现不同结果, OrangePi KunPeng Pro处理器处理非常清晰和简单,上溢和下溢。...在传统x86架构下,是可以正常运作,毕竟大多数电脑都是Intel,大家在日常开发中都已经使用N次,这里就不再进行测试,直接针对KunPeng架构测试是否能够正常运行 Calculate 为 Java

    18810

    小心两个共享库共用同一个静态库

    .html(Linux上制作可执行共享库示例) 问1:如果测试中全局变量global_var是个构造和析构类对象,会如何?...位置无关代码(PIC)对常量和函数入口地址操作都是采用基于基寄存器(base register)BASE+ 偏移量相对地址寻址方式,即使程序被装载到内存中不同地址(即 BASE值不同),而偏移量是不变...原因是在使用dlopen动态加载共享库,如果静态库中包含有全局变量,可能会出现名同地址不同全局变量。 解决办法:总是使用RTLD_GLOBAL加载共享库,而不是RTLD_LOCAL。.../Linux 2.6.16 附: 1)如果你想覆盖系统调用,可以使用LD_PRELOAD或/etc/ld.so.preload,也可进一步了解RTLD_NEXT; 2)静态库顺序关系:假设X.a...链接指定共享库搜索路径(类似于设置LD_LIBRARY_PATH): -Wl,-rpath=/usr/local/abc:/data/abc 以上也可以分开写:

    2.7K50
    领券