我正在嘗試使用帶有 newlib 的 RISC-V 工具鏈和一個聯結器腳本來構建一個 64 位可執行的 RISC-V ELF,該聯結器腳本將文本部分放在 0x100 處,將資料部分放在 0x100000000 處(大于 2 GB 的限制)。但是,我收到以下錯誤:
relocation truncated to fit: R_RISCV_HI20 against symbol `__global_pointer$' defined in .sdata section in a.out
collect2: error: ld returned 1 exit status
我注意到 RISC-V 選項指定了這兩個 --mcmodel 選項:
-mcmodel=medlow
Generate code for the medium-low code model. The program and its statically defined symbols must lie within a single 2 GiB address range and must lie between absolute addresses -2 GiB and 2 GiB. Programs can be statically or dynamically linked. This is the default code model.
-mcmodel=medany
Generate code for the medium-any code model. The program and its statically defined symbols must be within any single 2 GiB address range. Programs can be statically or dynamically linked.
但是,我很困惑為什么即使使用 64 位暫存器,為什么不能在我的可執行檔案中使用整個 64 位地址空間。任何澄清將不勝感激。
uj5u.com熱心網友回復:
在x86-64、ARM64等其他64位平臺上也有類似情況。
加載靜態地址的正常方法是 32 位立即數,絕對地址或 pc 相對地址。這比每次使用地址時都需要 64 位立即數更有效,后者往往需要更長更慢的指令序列。但這確實意味著所有靜態代碼和資料都需要容納 2 GB。
您可以將更多的 64 位地址空間用于動態分配的物件,因為它們不需要將地址編碼到二進制檔案中。此限制僅適用于靜態代碼和資料。此外,我不確定 RISC-V,但我相信在其他平臺上,2 GB 的限制分別適用于每個共享庫,因此仍然可以通過將片段分解為共享庫來撰寫真正龐大的應用程式。
在 x86-64 和 ARM64 上,GCC 確實支持“大”代碼模型,其中所有靜態地址都加載為 64 位,但會帶來相應的性能損失。RISC-V 目前似乎不支持此功能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/373333.html
標籤:linux 海湾合作委员会 操作系统 小精灵 风险控制
下一篇:使用sed命令替換
