解決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.pswp.cn/news/716965.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/716965.shtml
英文地址,請注明出處:http://en.pswp.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;但它對于每一位初…