繁体   English   中英

如何告诉 gcc 不对齐堆栈上的 function 参数?

[英]How to tell gcc to not align function parameters on the stack?

我正在尝试将 68000 处理器的可执行文件反编译为 C 代码,将原始子程序一一替换为 C 函数。

我面临的问题是我不知道如何让 gcc 使用与原始程序中使用的调用约定相匹配的调用约定。 我需要将堆栈上的参数打包,而不是对齐。

假设我们有以下 function

int fun(char arg1, short arg2, int arg3) {
    return arg1 + arg2 + arg3;
}

如果我们编译它

gcc -m68000 -Os -fomit-frame-pointer -S source.c

我们得到以下 output

fun:
    move.b 7(%sp),%d0
    ext.w %d0
    move.w 10(%sp),%a0
    lea (%a0,%d0.w),%a0
    move.l %a0,%d0
    add.l 12(%sp),%d0
    rts

如我们所见,编译器假定参数的地址为7(%sp)10(%sp)12(%sp)

堆栈上不需要的参数定位的图示

但要使用原始程序,他们需要有地址4(%sp)5(%sp)7(%sp)

所需参数位置的图示

一种可能的解决方案是按以下方式编写 function(处理器为大端序):

int fun(int bytes4to7, int bytes8to11) {
    char arg1 = bytes4to7>>24;
    short arg2 = (bytes4to7>>8)&0xffff;
    int arg3 = ((bytes4to7&0xff)<<24) | (bytes8to11>>8);
    return arg1 + arg2 + arg3;
}

但是,代码看起来很乱,我想知道:有没有办法既保持代码干净又达到预期的结果?


UPD:我犯了一个错误。 我正在寻找的偏移量实际上是5(%sp)6(%sp)8(%sp) (char-s 应该与 short-s 对齐,但 short-s 和 int-s仍然包装):

更新后所需参数位置的图示

希望这不会改变问题的本质。


UPD 2:事实证明,Sierra Systems 的 68000 C 编译器给出了所描述的偏移量(如在 UPD 中,具有 2 字节对齐)。

但是,问题是关于调整 gcc(或者可能是另一个现代编译器)中的调用约定。

这是一种打包结构的方法。 我在带有-m32的 x86 上编译它并在反汇编中获得了所需的偏移量,所以我认为它仍然适用于 mc68000:

typedef struct {
    char arg1;
    short arg2;
    int arg3;
} __attribute__((__packed__)) fun_t;

int
fun(fun_t fun)
{

    return fun.arg1 + fun.arg2 + fun.arg3;
}

但是,我认为可能还有更清洁的方法。 这将需要更多地了解生成此类调用序列的其他代码。 你有它的源代码吗?

其他代码是否必须保留在 asm 中? 使用源代码,您可以调整 asm 代码中的偏移量以与现代 C ABI 调用约定兼容。

自 1981 年以来,我一直在 C 中编程,并花了数年时间做 mc68000 C 和汇编代码(对于应用程序,Z50484C19F1AFDAF3841A0D821ED393D2 有点熟悉问题空间设备驱动程序)。

这不是 gcc 的“故障”,它是 68k 架构,要求堆栈始终在 2 个字节上对齐。 所以根本没有办法打破硬件堆栈上的 2 字节 alignment。

但要使用原始程序,他们需要有地址 4(%sp)、5(%sp) 和 7(%sp):

从 ODD memory 地址访问 word 或 long 值将立即触发 68000 上的 alignment 异常。

要获取使用 2 字节 alignment 而不是 4 字节 alignment 传递的整数参数,您可以通过-mshort将默认int大小更改为 16 位。 您需要将代码中的所有int替换为long (如果您希望它们为 32 位宽)。 执行此操作的粗略方法是将-Dint=long也传递给您的编译器。 显然,您将破坏 ABI 对使用-mno-short编译的 object 文件的兼容性(这似乎是 gcc 的默认设置)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM