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

bugzilla-daemon at freedesktop.org bugzilla-daemon at freedesktop.org
Mon Jan 24 15:18:17 PST 2011


https://bugs.freedesktop.org/show_bug.cgi?id=33440

           Summary: _gl_DispatchTSD in glapi_x86_64.S has incorrect
                    relocation type
           Product: Mesa
           Version: git
          Platform: x86-64 (AMD64)
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: medium
         Component: Mesa core
        AssignedTo: mesa-dev at lists.freedesktop.org
        ReportedBy: dimitry at andric.com


Created an attachment (id=42416)
 --> (https://bugs.freedesktop.org/attachment.cgi?id=42416)
Change relocation type of _gl_DispatchTSD to GOTPCREL

While building Mesa on FreeBSD, with recent binutils (>2.17), libGL.so.1
will fail to link with a misleading error:

...
mklib: Making FreeBSD shared library:  libGL.so.1
/usr/bin/ld: ../../../src/mesa/x86-64/glapi_x86-64.o: relocation R_X86_64_PC32
against `_gl_DispatchTSD' can not be used when making a shared object;
recompile with -fPIC
/usr/bin/ld: final link failed: Bad value

But of course, the glapi_x86-64.o file is already compiled with -fPIC,
the actual command line used is:

cc -c -I. -I../../../include -I../../../include/GL/internal -I../../../src/mesa
-I../../../src/mesa/glapi -I/usr/local/include -I/usr/local/include/drm
-I/usr/local/include -D_THREAD_SAFE -I/usr/local/include -I/usr/local/include
-O2 -pipe -fno-strict-aliasing -Wall -Wmissing-prototypes -std=c99 -ffast-math
-fno-strict-aliasing -fPIC -DUSE_X86_64_ASM -DHAVE_POSIX_MEMALIGN -DUSE_XCB
-DPTHREADS -DUSE_EXTERNAL_DXTN_LIB=1 -DIN_DRI_DRIVER -DHAVE_ALIAS
-DGLX_INDIRECT_RENDERING -DGLX_DIRECT_RENDERING -DXF86VIDMODE -D_REENTRANT
-UIN_DRI_DRIVER -DDEFAULT_DRIVER_DIR=\"/usr/local/lib/dri\"
../../../src/mesa/x86-64/glapi_x86-64.S -o
../../../src/mesa/x86-64/glapi_x86-64.o

The problem in glapi_x86-64.S is that if PTHREADS is defined,
_gl_DispatchTSD is declared as .extern, but is then accessed directly
with _gl_DispatchTSD(%rip), which is only applicable to locally defined
objects:

#elif defined(PTHREADS)

        .extern _glapi_Dispatch
        .extern _gl_DispatchTSD            # If this is extern...
        .extern pthread_getspecific

        .p2align        4,,15
_x86_64_get_dispatch:
        movq    _gl_DispatchTSD(%rip), %rdi    # ...this is incorrect
        jmp     pthread_getspecific at PLT

Instead, this access to _gl_DispatchTSD needs to be qualified with
@GOTPCREL, to indicate the symbol is relative to the Global Offset
Table, e.g.:

        movq    _gl_DispatchTSD at GOTPCREL(%rip), %rdi

(This was also found out by José Fonseca in one of his side branches,
commit b09d1ef60dae3b3c44f1370fd2f726c7044bc17)

As an example, consider the following small piece of C code:

extern int foo;

int bar(void)
{
        return foo + 42;
}

If you compile this on x86-64 with "gcc -O2 -fPIC -S", so for use in a
shared library, it will result in (approximately);

.globl bar
        .type   bar, @function
bar:
.LFB2:
        movq    foo at GOTPCREL(%rip), %rax
        movl    (%rax), %eax
        addl    $42, %eax
        ret

Again, since the glapi_x86-64.S file is generated from gl_x86-64_asm.py,
I changed both.

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