如何防止GNU ld重新排序目标文件?

时间:2017-01-29 10:25:23

标签: assembly linker gnu

我在i386程序集中实现了一个遍布多个.s文件的函数。函数的结果取决于机器代码连接的顺序,例如:

$ gcc -m32 -Wl,-N -W -Wall -Werror -s -O2 -o calladd calladd.c add10.s double.s add1.s ret.s && ./calladd a b; echo $?
27
$ gcc -m32 -Wl,-N -W -Wall -Werror -s -O2 -o calladd calladd.c add10.s add1.s double.s ret.s && ./calladd a b; echo $?
28

我总是希望最后使用ret.s中的代码(因为它包含ret指令),并且我想改变其他.s文件的顺序。

如何确保GNU ld按照我指定的顺序发出代码.s文件?它似乎默认工作,但我希望解决方案更具弹性,即显式禁用这些.s文件的重新排序,即使为其他文件启用了重新排序。哪些命令行标志是相关的?

我最好不要使用链接描述文件。

我的示例文件是:

# calladd.c:
extern int add10(int) __attribute__((regparm(1)));
int main(int argc, char **argv) { (void)argv; return add10(argc); }

# add10.s:
.text
.globl add10
add10:
addl $10, %eax

# add1.s:
.text
.globl add1
add1:
addl $1, %eax

# double.s:
.text
.globl double
double:
addl %eax, %eax

# ret.s:
.text
ret

1 个答案:

答案 0 :(得分:2)

基于@RossRidge的评论:GNU ld默认不重新排序源文件,只需依赖它。为避免因对齐而插入额外字节,请勿在{{1​​}}文件中使用amsmath或类似内容,并将它们放在同一部分.align