重定位二进制代码时出错(gcc - > objdata - >加载二进制代码 - >并执行)

问题描述:

我正在实现一个遗传算法,这些生物是具有三个指针作为输入和输出的函数。 所有的格式如下:重定位二进制代码时出错(gcc - > objdata - >加载二进制代码 - >并执行)

// 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]; 
} 

Compilated产生此工作代码:

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不生成此代码?从理论上讲,插入一个浮点常量可以做为here或不?

您有任何建议可以避免此问题吗?

编译器将常量放入您甚至不复制的.rodata部分,因此它不仅仅是重定位问题。你可以使用合并和重新定位为必要的,而不是objcopy代码自定义链接脚本,如下所示:

OUTPUT_FORMAT(binary) 

SECTIONS 
{ 
    merged : { 
     *(.text) 
     *(.rodata) 
    } = 0x90 

    /DISCARD/ : { 
     *(*) /* discard everything else */ 
    } 
} 

不知道为什么你想避免共享对象,这将是最简单的解决方案。你可以只是dlopen他们,不要打扰的细节。

+0

感谢它的工作!我想避免共享对象,因为它似乎不好加载成千上万的.so这样的功能如此之小,并且因为我把它当做爱好 – 2013-03-05 14:05:26