使用PPC程序集

时间:2017-05-24 16:02:11

标签: c gcc assembly gas powerpc

如何在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

2 个答案:

答案 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