使用PPC程序集引用其他文件中的符号

使用PPC程序集引用其他文件中的符号,c,gcc,assembly,gnu-assembler,powerpc,C,Gcc,Assembly,Gnu Assembler,Powerpc,如何在ppc程序集中引用当前文件外部的符号?我尝试查看.extern关键字,并在链接器文件中添加新符号,但没有成功 我有两个ppc程序集文件,它们是一个更大项目的一部分。我希望通过以下方式从文件2中引用文件1中的符号(_头): 文件1.S: .section ".head","ax" . = 0 .global __head __head: 文件2.S: .section ".head","ax" ... LOAD_32(%r3, file2_symbol_n

如何在ppc程序集中引用当前文件外部的符号?我尝试查看.extern关键字,并在链接器文件中添加新符号,但没有成功

我有两个ppc程序集文件,它们是一个更大项目的一部分。我希望通过以下方式从文件2中引用文件1中的符号(_头):

文件1.S:

    .section ".head","ax"

    . = 0
.global __head
__head:
文件2.S:

    .section ".head","ax"
...
    LOAD_32(%r3, file2_symbol_name - __head)
LOAD_32在哪里

#define LOAD_32(r, e)           \
    lis     r,(e)@h;            \
    ori     r,r,(e)@l;      
…但我收到以下错误:

file2.S: Assembler messages:
file2.S:113: Error: can't resolve `file2_symbol_name' {.head section} - `__head' {*UND* section}
file2.S:113: Error: expression too complex
在file1
LOAD\u 32(%r3,file1\u symbol\u name-\u head)
中使用时效果很好,因此我知道我没有正确导入符号名称。我该怎么做

编辑:

我已经把我的问题降到了最低限度,这样我就清楚这个问题了。下面是“快速生成”的所有代码、链接器文件、生成文件和终端输出

NB:当我注释掉other.S的第9行时,项目编译没有错误

总目S:

#include "asm-defines.h"

    .section ".head","ax"
    .align 0x10

    . = 0x0

.global __head
__head:
    LOAD_32(%r3, file1_symbol_name - __head)
    b   .

file1_symbol_name:
    b   .
其他

#include "asm-defines.h"

    .section ".head","ax"
    .align 0x10

.global other
other:
    LOAD_32(%r3, file2_symbol_name)
    LOAD_32(%r3, file2_symbol_name - __head)
    b   .

file2_symbol_name:
    b   .
asm定义了.h:

#ifndef ASM_DEFINES_H
#define ASM_DEFINES_H

/* Load an immediate 32-bit value into a register */
#define LOAD_32(r, e)           \
    lis     r,(e)@h;            \
    ori     r,r,(e)@l;      

#endif //ASM_DEFINES_H
quick.lds

ENTRY(__head);
生成文件

CC=$(CROSS)gcc
QFLAGS := -Wl,--oformat,elf64-powerpc -pie -m64 -mbig-endian -nostdlib

quick:
    $(CC) $(QFLAGS) -T quick.lds head.S other.S -o quick.o
$(CROSS)是指向交叉编译器的路径,我省略了它。 CC是powerpc64le构建根linux gnu gcc

终点站

$ make quick
powerpc64le-buildroot-linux-gnu-gcc -Wl,--oformat,elf64-powerpc -pie -m64 -mbig-endian -nostdlib -T quick.lds head.S other.S -o quick.o
other.S: Assembler messages:
other.S:9: Error: can't resolve `.head' {.head section} - `__head' {*UND* section}
other.S:9: Error: expression too complex
other.S:9: Error: can't resolve `.head' {.head section} - `__head' {*UND* section}
other.S:9: Error: expression too complex
make: *** [quick] Error 1

汇编程序无法在汇编时知道head.S和其他.S的位置/相对位置,以便能够计算file2_符号名称和头标签的相对位移。这是一个通用的汇编语言问题,不是特定于PPC的。

汇编程序无法在汇编时知道head.S和其他.S的位置/相对位置,从而能够计算文件2_符号名称和头标签的相对位移。这是一个通用的汇编语言问题,不是针对PPC的。

关于David的回答,请参见,其中规定:“减法。如果右参数是绝对的,则结果包含左参数的部分。如果两个参数位于同一部分,则结果是绝对的。您不能从不同部分减去参数。”错误消息表明汇编程序不知道哪个部分包含_头,实际上它不知道,因为符号及其部分没有在filescope中定义

通过使用.weak和/或.weakref指令,您可能可以获得所需的内容,以便可以在两个文件中定义符号,在链接时强引用将覆盖弱引用。我还没有尝试过这个。请参阅手册()并查找.weak


弱符号的一些背景信息如下:。

关于David的回答,请参见,其中规定:“减法。如果右参数是绝对的,则结果包含左参数的部分。如果两个参数位于同一部分,则结果是绝对的。您不能从不同部分减去参数。”错误消息表明汇编程序不知道哪个部分包含_头,实际上它不知道,因为符号及其部分没有在filescope中定义

通过使用.weak和/或.weakref指令,您可能可以获得所需的内容,以便可以在两个文件中定义符号,在链接时强引用将覆盖弱引用。我还没有尝试过这个。请参阅手册()并查找.weak


关于弱符号的一些背景信息如下:。

这是什么汇编程序?gnu汇编程序?(然后定义语言的程序)是的,它是gnu。这部分我相信我需要在组装中完成。我正在编写代码来修补系统重置中断向量,当我在这个向量上时,我将丢失所有的寄存器值,包括TOC指针。啊,我想我在做汇编,但它首先通过预处理器运行。它被定义为一个.s文件,我认为gcc将其视为“必须预处理的汇编代码”,因此使用#define可以很好地工作。我相信这个错误与对
-\u head
的引用有关,因为
加载32(%r3,file2\u symbol\u name)
在file2中编译得很好,就像在file1中
加载32(%r3,file1\u symbol\u name-\u head)
一样。也就是说,这是组装。。。因此,如果你建议包含一个c函数描述符,我不认为#include可以帮助我处理外部引用。要么我不理解这个问题,要么我解决了它,并在大约3-5分钟内在两个不同的后端测试了它,不是在计时…一个汇编解决方案和一个C语法解决方案。@old_timer如果你真的解决了它,那就太好了。我在上面编辑了我的文章,以包含问题的简化代码,我已经验证了该问题产生相同的错误条件。此外,如果我注释掉other.S的第9行,那么尽管other.S的第8行和head.S的第10行,该项目的编译还是很好的。在这种情况下,我正在寻找一种从其他.S引用
\u head
的方法。谢谢。这是什么汇编程序?gnu汇编程序?(然后定义语言的程序)是的,它是gnu。这部分我相信我需要在组装中完成。我正在编写代码来修补系统重置中断向量,当我在这个向量上时,我将丢失所有的寄存器值,包括TOC指针。啊,我想我在做汇编,但它首先通过预处理器运行。它被定义为一个.s文件,我认为gcc将其视为“必须预处理的汇编代码”,因此使用#define可以很好地工作。我相信这个错误与对
-\u head
的引用有关,因为
加载32(%r3,file2\u symbol\u name)
在file2中编译得很好,就像在file1中
加载32(%r3,file1\u symbol\u name-\u head)
一样。也就是说,这是组装。。。因此,如果你建议包含一个c函数描述符,我不认为#include可以帮助我处理外部引用。要么我不理解这个问题,要么我解决了它,并在大约3-5分钟内在两个不同的后端测试了它,不是在计时…一个汇编解决方案和一个C语法解决方案。@old_timer如果你真的解决了它,那就太好了。我有