2013-03-04 6 views
1

유전자 알고리즘을 구현하고 있습니다. 생물체는 입력 및 출력으로 3 개의 포인터가있는 함수입니다. 모든 형태 있습니다바이너리 코드를 재배치하는 중 오류가 발생했습니다 (gcc -> objdata ->로드 바이너리 코드 -> 실행)

// No need for global variables 

void _start (float *i, float *o, float *m) 
{ 
    ... 
    ... 
    ... 
} 

생물은 몇 천, 매우 작아야를, 그래서 공유 객체를 사용하지만 단순히 원시 코드를로드하고 실행하지 않기로 결정했다.

생물은 내가 이런 식으로

objcopy -O binary --only-section=.text code.o rawcode 

에서 함수의 코드를 가지고 다음 메모리에 코드를로드하고 실행 한 후

gcc -O3 -c code.c 

를 컴파일 그것을

((void(*)(void*,void*,void*)) loaded_code) (i, o, m); 

이 작업은 소스 코드 에서 부동 소수점 리터럴이 없습니다. 예컨대 코드 :

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

실행될 때 코드를 생성

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 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의 수천 가지가로드되는 것처럼 보이기 때문입니다. 왜냐하면 저는 취미로하고 있기 때문입니다. –