我正在实现一种遗传算法,这些生物是具有三个指针作为输入和输出的函数。都有以下形式:
// No need for global variables
void _start (float *i, float *o, float *m)
{
...
...
...
}
这些生物应该有几千个,而且非常小,所以我决定不使用共享对象,而是简单地加载原始代码并运行它。
生物被编译
gcc -O3 -c code.c
然后我这样取函数的代码
objcopy -O binary --only-section=.text code.o rawcode
然后将代码加载到内存中并运行它
((void(*)(void*,void*,void*)) loaded_code) (i, o, m);
这项工作直到源代码中没有浮点文字,例如代码:
void _start (int *i, int *o, int *m)
{
i[0] = m[0] + m[1];
}
编译产生这个工作代码:
gcc -O3 -c code.c
objdump -d code.o
code.o: formato del file elf64-x86-64
Disassemblamento della sezione .text:
0000000000000000 <_start>:
0: f3 0f 10 02 movss (%rdx),%xmm0
4: f3 0f 58 42 04 addss 0x4(%rdx),%xmm0
9: f3 0f 11 07 movss %xmm0,(%rdi)
d: c3 retq
但是具有浮点文字的函数为:
void _start (float *i, float *o, float *m)
{
i[0] = m[0] + 3.0f;
}
生成的代码在执行时不会给出正确的结果
gcc -O3 -c code.c
objdump -d code.o
code.o: formato del file elf64-x86-64
Disassemblamento della sezione .text:
0000000000000000 <_start>:
0: f3 0f 10 05 00 00 00 movss 0x0(%rip),%xmm0 # 8 <_start+0x8>
7: 00
8: f3 0f 58 02 addss (%rdx),%xmm0
c: f3 0f 11 07 movss %xmm0,(%rdi)
10: c3 retq
每次使用%rip生成指令时都会发生这种情况。如何将 gcc 设置为不生成此代码?理论上,插入一个浮点常量可以像这里那样做吗?
你有什么建议可以避免这个问题吗?