유전자 알고리즘을 구현하고 있습니다. 생물체는 입력 및 출력으로 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으로 할 수 있습니까?
이 문제를 방지하기위한 제안이 있으십니까?
고마워요! 나는 공유 객체를 피하고 싶었습니다. 왜냐하면 작고 작은 함수 때문에 .so의 수천 가지가로드되는 것처럼 보이기 때문입니다. 왜냐하면 저는 취미로하고 있기 때문입니다. –