【发布时间】:2016-01-29 08:57:34
【问题描述】:
上下文:
Linux 64.
我想告诉 gcc 在使用 gcc -O0 -S -g myprog.c 生成程序集时保持结构不变
我的意思是:我不希望通过地址引用结构,而是希望它们被标签引用。这将简化解析而无需再次阅读源代码。
所以,例如:
struct mystruct{
int32_t a;
char * b;
}
会变成这样:
label_mystruct:
-4(label_mystruct)
-12(label_mystruct)
例如,被引用:
add $56, -4(label_mystruct)
目前是这样引用的
.globl _main
_main:
LFB13:
LM157:
pushq %rbp #
LCFI27:
movq %rsp, %rbp#,
LCFI28:
subq $80, %rsp#,
movl %edi,-68(%rbp) # argc, argc,
movq %rsi,-80(%rbp) # argv, argv
Next line is the culprit:
movq -56(%rbp), %rdx # list, D.3781
movq -16(%rbp), %rax # arr, D.3780
movq %rdx, %rsi # D.3781,
movq %rax, %rdi # D.3780,
call _myaddhu #
我希望它是
label_mystruct:
-4(label_mystruct)
-12(label_mystruct)
.globl _main
_main:
LFB13:
LM157:
pushq %rbp #
LCFI27:
movq %rsp, %rbp#,
LCFI28:
subq $80, %rsp#,
movl %edi,-68(%rbp) # argc, argc,
movq %rsi,-80(%rbp) # argv, argv
Now it is fine:
movq label_mystruct, %rdx # list, D.3781
movq -16(%rbp), %rax # arr, D.3780
movq %rdx, %rsi # D.3781,
movq %rax, %rdi # D.3780,
call _myaddhu #
问题:
在不使用外部工具的情况下,使用 gcc 是否可行?
【问题讨论】:
-
“保持结构不变”是什么意思?顺序保证是相同的(位域有一些例外,AFAIK)。你指的是填充吗?
-
我的问题是我丢失了结构定义方式的信息。解析时,我希望能够知道我在结构中的位置,而无需再次阅读源代码。我刚刚编辑了问题。
-
“我在哪里”是什么意思?你是怎么解析的?你必须具体,否则这将是一个 XY-problem 没人会解决。
-
更新了问题 ;)