【问题标题】:Using global variables declared in C, in Arm assembly在 Arm 汇编中使用 C 中声明的全局变量
【发布时间】:2012-11-01 16:14:47
【问题描述】:

我有一个声明全局变量的 C 文件。该文件将与一些 ARM 程序集文件一起编译。

int foo;

void call_asm(void);

int main(void) {
    call_asm();
    return foo;
}
call_asm:
    ...

我尝试使用 link from the arm infocenter,但编译器 (arm-linux-gnueabi-gcc) 告诉我“导入”是未定义的指令。

我可以简单地做类似的事情吗:

LDR    r0, =GLOBAL_VAR

如何在汇编中使用C文件中定义的全局变量?

【问题讨论】:

  • 您应该接受您的答案或提供 cmets。
  • GAS 假定所有未声明的符号默认都是外部的。是的,您可以使用ldr r0, =foo 将地址输入r0。 (假设平台没有在 C 名称前添加 _。)
  • Andy Polyakov 在 OpenSSL 中有一项针对此用例的技术。查看sha1_armv4.S(和朋友)的翻译代码,以及如何处理OPENSSL_armcap_P。 (链接的代码是 Perl 源代码;需要按照Cryptogams SHA 进行翻译)。但是,我在共享库中遇到了 "unexpected reloc type 0x03"。我需要消化OPENSSL_armcap_P

标签: c assembly arm


【解决方案1】:

一旦你问 gcc 怎么做,这就变得很简单了。比如用gcc -S -O3编译如下函数:

extern int foo;
void useFoo()
{
    foo=7;
}

你会看到 gcc 是如何实现它的。

基于此,我设计了一个从 C 调用汇编函数来设置全局 C 变量的工作示例:

// test.c
#include <stdio.h>

void setupFoo();
int foo;

int main()
{
    setupFoo();
    printf("foo=%d\n", foo);
}
# test.s
.text
.global foo
.fooAddr:
    .word foo

.global setupFoo
setupFoo:
    ldr r0, .fooAddr
    mov r1, #123
    str r1, [r0]
    bx lr

编译运行:

$ gcc test.c test.s -o test && ./test
foo=123

在 gcc Raspbian 6.3.0-18+rpi1 上测试。

上面的汇编代码基于 useFoo 示例的 gcc 输出。更简单的方法是使用=foo,而不是手动将地址放入变量中:

# test.s
.text
.global foo
.global setupFoo
setupFoo:
    ldr r0, =foo
    mov r1, #123
    str r1, [r0]
    bx lr

这将导致foo 的地址被汇编器放在函数定义之后。

【讨论】:

  • 或者根据汇编器选项,ldr r0, =foo 伪指令可能会扩展为 movw/movk 以从两个 16 位立即数构造一个 32 位地址。
  • @PeterCordes 哪些选项可以让 GNU 汇编器做到这一点?
  • @Ruslan:我不知道。可能 gcc 只在编译器级别执行它,对于 -mcpu=cortex-a53 或其他东西,所以 GAS 可能永远不会这样做。不过,Clang 的内置汇编器可能知道 -march / -mcpu 选项。或者也许没有汇编器这样做过,ldr reg, =constant 总是一个负载。
【解决方案2】:

我认为您需要将指令从 ARM 汇编器转换为 GNU 汇编器。如果我理解正确,您可以使用.global 指令而不是.import 来访问任何全局符号。来自Using as 页面:

.global 符号

.global 使符号对 ld 可见。如果您在您的 部分程序,其值可用于其他部分程序 与它相关的。否则,symbol 从一个 来自另一个文件的同名符号链接到相同的 程序。

【讨论】:

    【解决方案3】:
    .extern (symbol)
    

    是你需要的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-25
      相关资源
      最近更新 更多