--- ./src/mesa/x86/glapi_x86.S.org 2007-04-28 16:21:10.000000000 +0200 +++ ./src/mesa/x86/glapi_x86.S 2007-05-02 18:28:57.000000000 +0200 @@ -63,7 +63,7 @@ GLOBL_FN(GL_PREFIX(fn, fn_alt)); \ GL_PREFIX(fn, fn_alt): \ CALL(_x86_get_dispatch) ; \ - NOP ; \ + MOV_L(GS:(EAX), EAX) ; \ JMP(GL_OFFSET(off)) #elif defined(PTHREADS) @@ -114,7 +114,10 @@ HIDDEN(GLNAME(_x86_get_dispatch)) ALIGNTEXT16 GLNAME(_x86_get_dispatch): - movl %gs:_glapi_tls_Dispatch@NTPOFF, %eax + call 1f +1: popl %edx + addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %edx + movl _glapi_tls_Dispatch@GOTNTPOFF(%edx), %eax ret #elif defined(PTHREADS) @@ -133,7 +136,7 @@ EXTERN GLNAME(_glapi_get_dispatch) #endif -#if defined( GLX_USE_TLS ) +#if defined( GLX_USE_TLS ) && !defined( GLX_X86_READONLY_TEXT ) .section wtext, "awx", @progbits #endif /* defined( GLX_USE_TLS ) */ --- ./src/mesa/glapi/glapi.c.org 2007-05-02 13:33:59.000000000 +0200 +++ ./src/mesa/glapi/glapi.c 2007-05-02 18:29:06.000000000 +0200 @@ -1035,14 +1035,17 @@ static void init_glapi_relocs( void ) { -#if defined( USE_X86_ASM ) && defined( GLX_USE_TLS ) - extern void * _x86_get_dispatch(void); - const GLubyte * const get_disp = (const GLubyte *) _x86_get_dispatch; +#if defined( USE_X86_ASM ) && defined( GLX_USE_TLS )\ + && !defined( GLX_X86_READONLY_TEXT ) + extern unsigned long _x86_get_dispatch(void); + char run_time_patch[5] = {0xb8, 0, 0, 0, 0};/* movl $0x0,%eax */ + unsigned long *offset = (unsigned long *) &run_time_patch[1]; + const GLubyte * const get_disp = (const GLubyte *) run_time_patch; GLubyte * curr_func = (GLubyte *) gl_dispatch_functions_start; - + *offset = _x86_get_dispatch(); while ( curr_func != (GLubyte *) gl_dispatch_functions_end ) { - (void) memcpy( curr_func, get_disp, 6 ); + (void) memcpy( curr_func, get_disp, sizeof(run_time_patch)); curr_func += DISPATCH_FUNCTION_SIZE; } #endif /* defined( USE_X86_ASM ) && defined( GLX_USE_TLS ) */