Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 链接器脚本符号上的数学运算符_Assembly_Gcc_Linker_Ld_Linker Scripts - Fatal编程技术网

Assembly 链接器脚本符号上的数学运算符

Assembly 链接器脚本符号上的数学运算符,assembly,gcc,linker,ld,linker-scripts,Assembly,Gcc,Linker,Ld,Linker Scripts,问这个问题有点难。但从根本上说,我试图使用链接器脚本定义的两个地址符号执行减法操作。相关章节: .text 0xffaa8000 { __text_start__ = .; *(.text*) __text_end__ = ALIGN(4); } 使用这些地址符号的文件通过如下操作定义: .section .text ret ret ret .quad __text_end__ - __text_start__ 但是在组装(gcc-c asm

问这个问题有点难。但从根本上说,我试图使用链接器脚本定义的两个地址符号执行减法操作。相关章节:

.text 0xffaa8000
{
    __text_start__ = .;
    *(.text*)
    __text_end__ = ALIGN(4);
}
使用这些地址符号的文件通过如下操作定义:

.section .text
    ret
    ret
    ret

.quad __text_end__ - __text_start__
但是在组装(
gcc-c asm.S-o asm.o
)时,我得到了以下结果:

.section .text
    ret
    ret
    ret

.quad __text_end__ - __text_start__
asm.S:6:错误:无法解析“\uuuu text\uu end\uuuu'{*UND*section}-”\uuuu text\uu start\uuuu'{*UND*section}

如果没有数学运算,它就可以正常工作。也就是说,对于这样一个文件:

.section .text
    ret
    ret
    ret

.quad __text_end__
.quad __text_start__

所以这是有道理的。符号是外部的,如果我们不知道它们的值,我们显然不能对它们执行减法。这可以通过发出重新定位来解决吗


编辑:试图删除泄漏到初始问题中的一些不相关信息。以防其他人在这里遇到类似问题。

ELF不支持引用多个符号的重新定位,因此这种计算已经过时。对于截面起点和终点之间距离的特殊情况,可能存在重新定位类型,但这取决于您为其编程的体系结构。通常,解决此问题的方法是将计算移到linker script.Hm中。这一定是真的。我所看到的执行类似选项的代码示例似乎是在链接器脚本中定义的本地(在ASM文件中,
linker\u sym-local\u sym
)上操作的。在这种情况下,它可能会起作用,因为初始条目可以是例如
-local\u sym
,其中重新定位条目指定添加
链接器\u sym
的最终地址。很高兴知道。另外,如果需要该功能,我想您可能能够为同一地址发出两个或多个重定位,以达到预期效果。如果您使用的是
gcc-c
,则链接器根本没有运行,并且您的链接器脚本与此无关;此消息来自汇编程序。我想它只能减去两个符号,它们的(相对)地址在汇编时是已知的,也就是说,它们实际上是在汇编源文件中定义的。@NateEldredge在发布之前,我对这个问题编辑了好几次。我最后在那里留下了一些不相关的信息。你的后一句话就是我在这里得出的结论。起初我认为
无法解析“\uuuu text\u end\uuuuu”
指的是它如何找不到符号,考虑到
-c
操作,我认为这很奇怪。但是当我输入这个时,我意识到这是一个无法解决的操作。ELF不支持引用多个符号的重新定位,因此这种计算已经过时了。对于截面起点和终点之间距离的特殊情况,可能存在重新定位类型,但这取决于您为其编程的体系结构。通常,解决此问题的方法是将计算移到linker script.Hm中。这一定是真的。我所看到的执行类似选项的代码示例似乎是在链接器脚本中定义的本地(在ASM文件中,
linker\u sym-local\u sym
)上操作的。在这种情况下,它可能会起作用,因为初始条目可以是例如
-local\u sym
,其中重新定位条目指定添加
链接器\u sym
的最终地址。很高兴知道。另外,如果需要该功能,我想您可能能够为同一地址发出两个或多个重定位,以达到预期效果。如果您使用的是
gcc-c
,则链接器根本没有运行,并且您的链接器脚本与此无关;此消息来自汇编程序。我想它只能减去两个符号,它们的(相对)地址在汇编时是已知的,也就是说,它们实际上是在汇编源文件中定义的。@NateEldredge在发布之前,我对这个问题编辑了好几次。我最后在那里留下了一些不相关的信息。你的后一句话就是我在这里得出的结论。起初我认为
无法解析“\uuuu text\u end\uuuuu”
指的是它如何找不到符号,考虑到
-c
操作,我认为这很奇怪。但当我把它打出来的时候,我意识到这是一个无法解决的手术。