c++ - ¡Error de segmentación en cualquier Yeppp! api call
linux segmentation-fault (1)
Necesita llamar a yepLibrary_Init()
antes de usar la biblioteca (y yepLibrary_Release()
después de terminar con él). Esta función detecta la microarquitectura de la CPU y los conjuntos de instrucciones e inicializa los punteros internos (que son inicialmente nulos, es por eso que obtienes segfault).
Para ser sincero, es la primera vez que uso cualquier tipo de biblioteca como Yeppp !, y me refiero a las librerías SIMD con selección de tiempo de ejecución dinámica, o como quiera que lo expresen. El resultado final es que la biblioteca debe elegir el código de ensamblaje SIMD óptimo para ejecutar en cualquier plataforma y hardware en el que se esté ejecutando.
Esto parecía una gran herramienta para usar en un proyecto mío, sin embargo, como dice el título, ¡no puedo llamar a ningún Yeppp! función sin que ocurra una falla de segmentación. La información de depuración que he podido obtener tampoco me ayuda.
La configuración de mi sistema es:
Xubuntu 13.04 ''raring'' with Linux 3.8.0-31-generic x86_64
GCC 4.8.1 --with-arch-32=i686 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu .... etc, there were many more, but I chose the important ones
Code::Blocks IDE and GDB 7.5.91.20130417-cvs-ubuntu debugger through Code::Blocks
Intel Pentium(R) Dual-Core CPU T4400 @ 2.20GHz with SIMD instruction sets MMX, SSE, SSE2, SSSE3
Enumero la CPU y tal porque puede ser importante cómo Yeppp! selecciona el tiempo de ejecución correcto, que puede ser el problema.
¡A continuación está el código de prueba simple que estoy usando, aunque probé otro Yeppp! funciones con varios tipos de datos, era la misma falla de segmentación. También probé varias alineaciones, como 32 y 64, pero dudo que ese sea el problema.
YEP_ALIGN(16) int32_t a[100], b[100], c[100];
//just test values
for( int x = 0; x < 100; x++ ) {
a[x] = x + 1;
b[x] = x - 1;
}
yepCore_Add_V32sV32s_V32s( a, b, c, 100 );
No estoy compilando con banderas especiales ni nada, así que no -m32 o 64. He intentado lo mismo en C, también, con los mismos resultados y básicamente ensambles idénticos, así que no es el lenguaje.
¡Vínculo con el binario de Linux x86_64 libyeppp.so proporcionado con Yeppp! distribución, ya que estoy ejecutando una plataforma de 64 bits, y es el único que GCC incluso acepta.
El desmontaje de la llamada es:
0x40179a lea rdx,[rbp-0x1a0]
0x4017a1 lea rsi,[rbp-0x330]
0x4017a8 lea rax,[rbp-0x4c0]
0x4017af mov ecx,0x64
0x4017b4 mov rdi,rax
0x4017b7 call 0x401550 <yepCore_Add_V32sV32s_V32s@plt>
Lo cual se ve bastante estándar. Sin embargo, al entrar en la función que obtengo:
0x401550 jmp QWORD PTR [rip+0x205b7a] # 0x6070d0 <[email protected]>
0x401556 push 0x17
0x40155b jmp 0x4013d0
0x401550 jmp QWORD PTR [rip+0x205b7a] # 0x6070d0 <[email protected]>
0x401556 push 0x17
0x40155b jmp 0x4013d0
Que luego, siguiendo adelante algunas instrucciones al jmp 0x4013d0
, después de ejecutar ese GDB me da
0 No function contains specified address.
Luego, la siguiente instrucción, suponiendo que hay una y no intenta ejecutarse en NULL, conduce a la falla de segmentación. Eso es todo lo que he podido conseguir. Después de algunas modificaciones, intenta abrir un archivo ../sysdeps/x86_64/dl-trampoline.S
, que no pudo encontrar.
Estoy casi en un callejón sin salida en cuanto a por qué lo haría, a menos que Yeppp! en sí mismo es defectuoso. Desde la versión 1.0 de Yeppp! la biblioteca tiene solo unos pocos días, no he podido encontrar a nadie con un problema similar o ningún problema.
PD: esta es la primera vez en mucho tiempo que he hecho públicamente una pregunta sobre programación, por lo que si se necesita más información para ayudar a resolver esto, se lo facilitaré encantado.