解决GCC连接器(lld)出现问题 relocation truncated to fit (重定向截断)

本文大致提点这个问题,有哪些可行的解决方案。

这是常见 C/C++ 的一类连接器错误,我们需要知道它一般是怎么产生的,才能知道如何正确的解决它。

例如:(当发生这类问题时,连接器通常会输出这样的信息)

[build] /usr/mips64el-linux-gnuabi64/include/c++/7/mips64el-linux-gnuabi64/bits/gthr-default.h:251:(.text+0x1c): relocation truncated to fit: R_MIPS_GOT_DISP against `__pthread_key_create@@GLIBC_2.0'

[build] CMakeFiles/xxx.dir/xxx/net/asio/websocket.cpp.o: In function `__gthread_mutex_lock(pthread_mutex_t*)':

[build] /usr/mips64el-linux-gnuabi64/include/c++/7/mips64el-linux-gnuabi64/bits/gthr-default.h:748:(.text+0x90): relocation truncated to fit: R_MIPS_CALL16 against `pthread_mutex_lock@@GLIBC_2.0'

[build] CMakeFiles/xxx.dir/xxx/net/asio/websocket.cpp.o: In function `__gthread_mutex_unlock(pthread_mutex_t*)': [build] /usr/mips64el-linux-gnuabi64/include/c++/7/mips64el-linux-gnuabi64/bits/gthr-default.h:778:(.text+0x114): relocation truncated to fit: R_MIPS_CALL16 against `pthread_mutex_unlock@@GLIBC_2.0'

通常出现这类连接器问题,多数是C++编译器编译CC/CPP源文件出来的 .obj(*.o)文件太大了,导致超出了一些平台CPU可以短链接重定向的范围。

注意:这个问题可能会在 MIPS、MIPS64 CPU架构上面较容易出现。

以下是可以采纳的解决方案(逐个试)

1、拆分引起连接器暴这个错误的 cpp 文件(XXX.o 对应那个CPP文件)把这个源文件自己分析,按着拆分到多个 cpp 文件之中在编译

2、按需配置C语言、C++ 语言的编译器选项,增加编译器选项 -mlong-calls

     -mlong-calls 编译器选项是指:要求编译器适用VA绝对地址(长地址)来调用跳转,这样呢,可以显著解决因为 XXX.o 编译出来的二进制太大,导致连接器无法连接上的问题。

    但是缺点肯定是有的,那就是效率肯定没有RVA相对地址(短地址)跳转速度块,因为绝对地址都是需要先放在寄存器之中的,在按照寄存器的值跳转,不能直接JMP到绝对地址上面的,相当于每次都要多走一些流程,并且在CPU之中相对寻址本来就比随机的绝对寻址要快的。

3、配置连接器选项,增加选项

1、尝试使用 -Wl,--no-relax 选项来禁用链接器的放松(relocation relaxation)功能,这可能有助于解决一些符号重定位(truncated relocation)的问题。

2、使用 -Wl,--no-merge-exidx-entries 选项来禁止合并 .ARM.exidx 表条目,这可能有助于解决某些链接问题。

这条会有限制,C++ 17 直接没法用了,而且 C++ 11 的一些模板展开特性也会受到限制,基本不是很推荐通过这条指令来解决,但如果真的必须要,无可避免、退无可退的情况下,您或许可以考虑设置它到连接器上面试试看,的确是有效的。

4、调整编译器选项,增加选项

1、考虑添加 -fPIC 选项以生成位置无关代码(Position Independent Code),这有助于减少一些链接时的问题。


2、也可以尝试添加 -ffunction-sections -fdata-sections 选项来将函数和数据放置到单独的段(section)中,这有助于优化链接器的处理。

在这些解决方案之中,相对更亲民靠谱的解决方案还是编译器增加选项: -mlong-calls,另外就是手动拆分C/CPP源文件到多个之中了,毕竟平台及编译器限制也是没有办法不是。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/716965.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Spring Security 简易速速上手小册》第8章 常见问题与解决方案(2024 最新版)

文章目录 8.1 异常处理和日志记录8.1.1 基础知识详解8.1.2 重点案例:统一异常处理案例 Demo拓展 8.1.3 拓展案例 1:日志记录策略案例 Demo拓展 8.1.4 拓展案例 2:日志聚合案例 Demo拓展 8.2 多租户安全性问题8.2.1 基础知识详解8.2.2 重点案例…

深入Kafka client

分区分配策略 客户端可以自定义分区分配策略, 当然也需要考虑分区消费之后的offset提交, 是否有冲突。 消费者协调器和组协调器 a. 消费者的不同分区策略, 消费者之间的负载均衡(新消费者加入或者存量消费者退出), 需要broker做必要的协调。 b. Kafka按照消费组管理消费者, …

VUE3:省市区联级选择器

一、实现效果 二、代码展示 <template><div class"page"><select v-model"property.province"><option v-for"item in provinces" :key"item">{{ item }}</option></select><select v-model&…

今日学习总结2024.3.2

最近的学习状态比较好&#xff0c;感觉非常享受知识进入脑子的过程&#xff0c;有点上头。 实验室一个星期唯一一天的假期周六&#xff0c;也就是今天&#xff0c;也完全不想放假出去玩啊&#xff0c;在实验室泡了一天。 很后悔之前胆小&#xff0c;没有提前投简历找实习&…

YOLOv9有效提点|加入MobileViT 、SK 、Double Attention Networks、CoTAttention等几十种注意力机制(五)

专栏介绍&#xff1a;YOLOv9改进系列 | 包含深度学习最新创新&#xff0c;主力高效涨点&#xff01;&#xff01;&#xff01; 一、本文介绍 本文只有代码及注意力模块简介&#xff0c;YOLOv9中的添加教程&#xff1a;可以看这篇文章。 YOLOv9有效提点|加入SE、CBAM、ECA、SimA…

ETH网络中的区块链

回顾BTC网络的区块链系统 什么是区块链&#xff1f;BTC网络是如何运行的&#xff1f;BTC交易模式 - UXTO ETH网络中的区块链 ETH网络的基石依旧是 区块链。上面 什么是区块链&#xff1f; 的文章依旧适用。 相比BTC网络&#xff0c;ETH网络的账户系统就相对复杂&#xff0c;所…

ZJGSU 1199 表达式计算

题目描述 在数据结构课上&#xff0c;老师给大家布置了一个表达式计算的问题 3*21*5. Its so easy!!! csw同学做了很不过瘾&#xff0c;他想求解更复杂的表达式: 比如(123456)/789. 但一时之间他想不出好的办法&#xff0c;诸位就帮帮他吧. 输入 输入包括多组数据, 每组测试…

实用工具:实时监控服务器CPU负载状态并邮件通知并启用开机自启

作用&#xff1a;在服务器CPU高负载时发送邮件通知 目录 一、功能代码 二、配置开机自启动该监控脚本 1&#xff0c;配置自启脚本 2&#xff0c;启动 三、功能测试 一、功能代码 功能&#xff1a;在CPU负载超过预设置的90%阈值时就发送邮件通知&#xff01;邮件内容显示…

【Spring连载】使用Spring Data访问 MongoDB----对象映射之属性转换器

【Spring连载】使用Spring Data访问 MongoDB----对象映射之属性转换器 一、声明式值转换器二、编程式值转换器注册三、MongoCustomConversions配置 虽然基于类型的转换已经提供了影响目标存储中某些类型的转换和表示的方法&#xff0c;但当仅考虑特定类型的某些值或属性进行转换…

js中Generator函数详解

定义&#xff1a; promise是为了解决回调地狱的难题出现的&#xff0c;那么 Generator 就是为了解决异步问题而出现的。 普通函数&#xff0c;如果调用它会立即执行完毕&#xff1b;Generator 函数&#xff0c;它可以暂停&#xff0c;不一定马上把函数体中的所有代码执行完毕…

Linux基本指令(下)

目录 1. less指令 2. head与tail指令 3. find指令 示例 4. grep指令 示例 ​编辑 5. zip/unzip 打包与压缩 示例 ​编辑 6. tar指令 7. find指令&#xff1a; -name 8. echo指令 9. 时间相关的指令 1.在显示方面&#xff0c;使用者可以设定欲显示的格式&#xff…

分布式ID(6):Redis实现分布式ID生成

Redis是一个高性能的键值数据库,它可以用于生成分布式唯一标识符。需要注意的是Redis实现ID可以用,这也是很多公司的选择。但是在redis服务器宕机的情况下,他也可能会出现重复生成ID的情况。 1 实现原理 利用Redis的原子操作:Redis提供了原子性的INCR和INCRBY命令,可用于…

使用python或AI自动分析数据关联(简介)

有一些Python库可以帮助用户自动发现数据集中的关联关系。通常这类方法被称为关联分析或关联规则挖掘&#xff0c;其中最著名的算法是Apriori和FP-Growth。 两个算法 Apriori算法&#xff1a; 这是一个用于频繁项集挖掘和关联规则学习的经典算法。Python中的mlxtend库提供了一…

【机器学习】有监督学习算法之:K最近邻

K最近邻 1、引言2、决策树2.1 定义2.2 原理2.3 实现方式2.3.1 距离度量2.3.2 K值的选择 2.4 算法公式2.5 代码示例 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 这么长时间没更新了&#xff0c;是不是得抓紧时间了。 小鱼&#xff1a;最近可都是在忙的呢&#xff0c;…

已解决ResponseEntityException的Spring MVC异常响应实体异常的正确解决方法,亲测有效!!!

由于ResponseEntityException并非Spring框架中明确定义的异常类&#xff0c;我推断这里可能指的是在使用ResponseEntity时遇到的常见异常或错误。因此&#xff0c;我将根据这个假设&#xff0c;提供一个解决Spring MVC中与ResponseEntity相关异常的通用方法指南。 目录 问题分…

线上历史馆藏系统 Java+SpringBoot+Vue+MySQL

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

day09_商品管理订单管理SpringTaskEcharts

文章目录 1 商品管理1.1 添加功能1.1.1 需求说明1.1.2 核心概念SPUSKU 1.1.3 加载品牌数据CategoryBrandControllerCategoryBrandServiceCategoryBrandMapperCategoryBrandMapper.xml 1.1.4 加载商品单元数据ProductUnitProductUnitControllerProductUnitServiceProductUnitMap…

详解java中的Lambda表达式

Lambda表达式的前世今生&#xff08;来历与概述&#xff09; Lambda表达式的前世------匿名类 以往&#xff0c;使用单一抽象方法的接口被用作函数类型。 它们的实例表示函数&#xff08;functions&#xff09;或行动&#xff08;actions&#xff09;。 自从 JDK 1.1 于 1997…

【MySQL】超详细-基础操作

数据库定义 数据库是一类软件&#xff0c;用来管理数据&#xff0c;组织数据&#xff1b; 关系型数据库MySQL&#xff08;Oracle,SQL Server,SQLite&#xff09;以表格形式组织数据&#xff0c;数据格式要求严格&#xff1b;非关系型数据库Redis&#xff08;MongoDB,HBase&…

数据结构与算法-冒泡排序

引言 在数据结构与算法的世界里&#xff0c;冒泡排序作为基础排序算法之一&#xff0c;以其直观易懂的原理和实现方式&#xff0c;为理解更复杂的数据处理逻辑提供了坚实的入门阶梯。尽管在实际应用中由于其效率问题不常被用于大规模数据的排序任务&#xff0c;但它对于每一位初…