- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我收到链接错误:
dangerous relocation: l32r: Literal placed after use:
最佳答案
这是一个由两部分组成的答案,因为这里真的有两个问题,一个是一般问题(“什么是危险的重定位?”)和一个特定于 Xtensa(“为什么不能在代码?”)。
无论如何,这些危险的搬迁都是关于什么的?
要了解什么是“危险搬迁”,我们必须首先了解什么是搬迁。当编译器从某段代码生成目标文件时,它需要引用在其他地方定义的符号:可能在链接中的另一个目标文件中,或者可能在共享库中。但是,编译器在编译给定的目标文件时并不知道外部符号的地址。它必须发出一个重定位来充当命名占位符,告诉链接器“好吧,把 foobar
的地址推到这个位置,哦,你必须对它做 X、Y 和 Z 以使其适合那里有指示。”
大多数情况下,这可以顺利运行,您从链接器中得到一个二进制文件,而 Bob 是您的叔叔。当这个过程发生故障,并且链接器无法使编译器给它的符号地址适合重定位站点的指令时,它放弃并抛出“危险重定位”消息(其中包括所有-too-common 'relocation truncated to fit' 也会从这个过程中弹出)通知程序员某些事情已经发生了严重的错误。
放置在使用位置之后的文字有什么问题?
现在我们知道什么是一般的“危险重定位”,我们可以继续看错误消息的后半部分,即“l32r:使用后放置的文字”。 Xtensa 使用称为 L32R
的指令。从内存中加载不适合 Xtensa 的常量值 MOVI
立即加载指令,具有 12 位有符号立即数字段。 L32R
指令在 Xtensa ISA reference 中描述如下:
L32R is a PC-relative 32-bit load from memory. It is typically used to load constant values into a register when the constant cannot be encoded in a MOVI instruction.
L32R forms a virtual address by adding the 16-bit one-extended constant value encoded in the instruction word shifted left by two to the address of the L32R plus three with the two least significant bits cleared. Therefore, the offset can always specify 32-bit aligned addresses from -262141 to -4 bytes from the address of the L32R instruction. 32 bits (four bytes) are read from the physical address. This data is then written to address register
at
.
L32R
的限制上面引用的错误消息很好地分解了:编译器生成了
L32R
在代码中的某处加载一个常量(可以是一个值或一个地址),但是编译器无法使用该常量的值(想想
extern const
),或者链接器需要填充的地址(这个是可能的情况)。所以,它发出了这个
L32R
重定位告诉链接器在
L32R
中“填空”程序中某处具有常量值或常量地址的指令。但是,链接器在之前的 256KB 代码(或文字池,具体取决于您的编译器和 Xtensa 内核的配置方式)中找不到任何地方来推送常量,因此它放弃并吐出您询问的错误消息关于。
-mno-text-section-literals
进行编译(这是默认设置),链接器将文字池作为单独的部分提供给它,然后它必须与代码部分交错。如果您的链接中有一个特别大的目标文件,它的
.text
中可能有超过 256KB 的代码。部分,在
L32R
的范围内无处可去链接器放置相关文字池部分的指令。编译
-mtext-section-literals
应消除错误;如果它不起作用,则您已经打开了该标志,或者如果您正在使用
-ffunction-sections
(将每个函数放入其自己的部分;有时在嵌入式工作中使用它以允许链接器丢弃未使用的代码),请继续阅读。
ENTRY
指令之前),以最大限度地减少文字的风险pools 将作为代码执行,结果显然很糟糕。如果你的代码中有一个非常长的函数——我不知道什么样的函数可以生成超过 256KB 的代码——放置在
ENTRY
之前的“默认”文字池指令可能会超出
L32R
的范围接近函数末尾的指令。通常,编译器会发出一个名为
.literal_position
的汇编指令。 ,以及围绕中间函数文字池的跳转,为汇编器和链接器提供一个额外的地方来将文字插入。您可以使用
-save-temps
告诉编译器输出汇编器列表。然后搜索
.literal_position
指令;如果在具有
L32R
的函数中不存在指令超过 256KB 标记,恭喜!您刚刚发现了一个编译器错误!
ENTRY
之前没有任何地方编译器或链接器可以放置文字池的指令,而编译器无法自行解决——这可能发生在中断处理程序或链接器显式放置在物理内存边界开头的函数中脚本。在这种情况下,您需要插入
.literal_position
指令及其相关的跳转和标签在
asm
中手动语句在罪魁祸首函数的顶部,以便为汇编程序提供一个放置罪魁祸首函数文字的地方。如
GAS manual说:
The assembler will automatically place text section literal pools before
ENTRY
instructions, so the.literal_position
directive is only needed to specify some other location for a literal pool. You may need to add an explicit jump instruction to skip over an inline literal pool.For example, an interrupt vector does not begin with an
ENTRY
instruction so the assembler will be unable to automatically find a good place to put a literal pool. Moreover, the code for the interrupt vector must be at a specific starting address, so the literal pool cannot come before the start of the code. The literal pool for the vector must be explicitly positioned in the middle of the vector (before any uses of the literals, due to the negative offsets used by PC-relativeL32R
instructions).
LITBASE
Xtensa 核心中启用的选项并收到此错误,这表明您的文字池已溢出。在这种情况下,编译器应该生成切换文字池所需的“胶水”:如果没有,恭喜!您刚刚发现了一个编译器错误!
关于c++ - 危险的重定位错误是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19532826/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!