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

Referencing symbols in other files using PPC assembly

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

我有两个 ppc 程序集文件,它们属于一个更大的项目。我希望以这种方式从 file2 引用 file1 中的符号 (__head):

file1.S:

    .section ".head","ax"

    . = 0
.global __head
__head:

file2.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_32(%r3, file1_symbol_name - __head) 工作正常所以我知道我没有正确导入符号名称。我该怎么做?

编辑:

我已经将我的问题减少到最少的部分,这样我就清楚了这个问题。以下是 "make quick".

的所有代码、链接器文件、Makefile 和终端输出

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

head.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   .

other.S

#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-defines.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-buildroot-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 和 other.S 的放置/相对位置,无法计算 file2_symbol_name 和 __head 的相对位移标签。这是一个通用的汇编语言问题,而不是特定于 PPC 的问题。

关于 David 的回复,请参阅 https://sourceware.org/binutils/docs/as/Infix-Ops.html#Infix-Ops,其中指定:"Subtraction. If the right argument is absolute, the result has the section of the left argument. If both arguments are in the same section, the result is absolute. You may not subtract arguments from different sections." 错误消息表明汇编器不知道哪个部分包含 __head,而事实上它不能,因为该符号及其部分未在文件范围中定义。

您可以通过使用 .weak and/or .weakref 指令获得您想要的内容,这样符号就可以在两个文件中定义,强引用覆盖 [=22 处的弱引用=] 时间。我没有试验过这个。请参阅手册 (https://sourceware.org/binutils/docs/as/) 并寻找 .weak.

这里有一些关于弱符号的背景信息:https://en.wikipedia.org/wiki/Weak_symbol