如何在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和终端输出。
NB:当我注释掉其他的第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
答案 0 :(得分:0)
汇编程序无法知道head.S和其他的位置/相对位置。在汇编时,能够计算file2_symbol_name和__head标签的相对位移。这是一般汇编语言问题,而不是PPC特定问题。
答案 1 :(得分:0)
关于David的回复,请参阅https://sourceware.org/binutils/docs/as/Infix-Ops.html#Infix-Ops,其中指定:“减法。如果右参数是绝对的,则结果具有左参数的部分。如果两个参数都在同一部分中,则结果为绝对。你不能从不同的部分中减去参数。“错误消息表明汇编程序不知道哪个部分包含__head,实际上它不能,因为符号及其部分未在filescope中定义。
您可以使用.weak和/或.weakref指令获得所需内容,以便可以在两个文件中定义符号,强引用在链接时覆盖弱引用。我没有尝试过这个。请参阅手册(https://sourceware.org/binutils/docs/as/)并寻找.weak。
弱符号的一些背景信息在这里:https://en.wikipedia.org/wiki/Weak_symbol。