我在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
答案 0 :(得分:2)
基于@RossRidge的评论:GNU ld默认不重新排序源文件,只需依赖它。为避免因对齐而插入额外字节,请勿在{{1}}文件中使用amsmath
或类似内容,并将它们放在同一部分.align
。