2013-03-04 66 views
1

我正在實現一個遺傳算法,這些生物是具有三個指針作爲輸入和輸出的函數。 所有的格式如下:重定位二進制代碼時出錯(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或不?

您有任何建議可以避免此問題嗎?

回答

0

編譯器將常量放入您甚至不復制的.rodata部分,因此它不僅僅是重定位問題。你可以使用合併和重新定位爲必要的,而不是objcopy代碼自定義鏈接腳本,如下所示:

OUTPUT_FORMAT(binary) 

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

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

不知道爲什麼你想避免共享對象,這將是最簡單的解決方案。你可以只是dlopen他們,不要打擾的細節。

+0

感謝它的工作!我想避免共享對象,因爲它似乎不好加載成千上萬的.so這樣的功能如此之小,並且因爲我把它當做愛好 – 2013-03-05 14:05:26