[Mesa-dev] [Bug 33440] _gl_DispatchTSD in glapi_x86_64.S has incorrect relocation type

bugzilla-daemon at freedesktop.org bugzilla-daemon at freedesktop.org
Thu Jan 27 13:07:18 PST 2011


Dimitry Andric <dimitry at andric.com> changed:

           What    |Removed                     |Added
  Attachment #42416|0                           |1
        is obsolete|                            |

--- Comment #4 from Dimitry Andric <dimitry at andric.com> 2011-01-27 13:07:18 PST ---
Created an attachment (id=42610)
 View: https://bugs.freedesktop.org/attachment.cgi?id=42610
 Review: https://bugs.freedesktop.org/review?bug=33440&attachment=42610

Change relocation type of _gl_DispatchTSD to GOTPCREL, take 2

Okay, I think I have now determined the proper way to solve this issue.
I should have examined my own gcc example more closely... :)

When Mesa is using pthreads, _gl_DispatchTSD is actually an instance of
the following struct:

struct u_tsd {
   pthread_key_t key;
   int initMagic;

The purpose of _x86_64_get_dispatch is to get the pthread-specific data
associated with the key (normally a struct mapi_table pointer).  In C
this would be:

void *_x86_64_get_dispatch(void)
   return pthread_getspecific(_gl_DispatchTSD.key);

which, using -fPIC, gets compiled by gcc to:

    movq    _gl_DispatchTSD at GOTPCREL(%rip), %rax
    movl    (%rax), %edi
    jmp    pthread_getspecific at PLT

E.g. the _gl_DispatchTSD at GOTPCREL(%rip) reference gives a pointer to the
start of the struct, which gets stored in %rax.  Then, the pointer is
dereferenced to get the first member of the struct: an unsigned int on
Linux, even on x86-64 (on FreeBSD, it's a regular int).  It is stored in
%edi, to serve as first parameter to pthread_getspecific(), which is

So please try this revised patch, which I have actually tested to run
properly on Linux.

Configure bugmail: https://bugs.freedesktop.org/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
You are the assignee for the bug.

More information about the mesa-dev mailing list