tech-pkg archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

graphics/gle fails in configure stage (table_noop_array undef'd)



graphics/gle fails in the configure stage with this error message:

checking for remove... yes
checking for shmat... yes
checking for IceConnectionNumber in -lICE... yes
checking for glGetError in -lGL... no
configure: error: Cannot find required GL library
*** Error code 1

Stop.

gle is needed for xscreensaver.

It looks like the GL problem here could easily occur to other packages
than gle.

The real problem is, as shown in the config.log file:


configure:9222: checking for glGetError in -lGL
configure:9253: gcc -o conftest -O2 -D_FORTIFY_SOURCE=2 -I/usr/pkg/include -I/usr/X11R7/include -I/usr/include -I/usr/pkg/include/libdrm -Wall -I/usr/pkg/include -I/usr/X11R7/include -I/usr/include -I/usr/pkg/include/libdrm -L/usr/pkg/gcc49/lib/gcc/x86_64--netbsd/4.9.4 -Wl,-R/usr/pkg/gcc49/lib/gcc/x86_64--netbsd/4.9.4 -L/usr/pkg/lib -L/usr/X11R7/lib -Wl,-R/usr/X11R7/lib -Wl,-R/usr/pkg/lib -L/usr/lib -Wl,-R/usr/lib conftest.c -lGL  -lSM -lICE  -L/usr/X11R7/lib -lX11  -lXext -lm >&5
/pkg_comp/obj/pkgsrc/graphics/gle/default/.buildlink/lib/libGL.so: undefined reference to `table_noop_array'
collect2: error: ld returned 1 exit status
configure:9256: $? = 1
configure: failed program was:
| #line 9230 "configure"
| /* confdefs.h.  */
| 
| #define PACKAGE_NAME ""
| #define PACKAGE_TARNAME ""
| #define PACKAGE_VERSION ""
| #define PACKAGE_STRING ""
| #define PACKAGE_BUGREPORT ""
| #define PACKAGE "gle"
| #define VERSION "3.1.0"
| #define STDC_HEADERS 1
| #define HAVE_SYS_TYPES_H 1
| #define HAVE_SYS_STAT_H 1
| #define HAVE_STDLIB_H 1
| #define HAVE_STRING_H 1
| #define HAVE_MEMORY_H 1
| #define HAVE_STRINGS_H 1
| #define HAVE_INTTYPES_H 1
| #define HAVE_STDINT_H 1
| #define HAVE_UNISTD_H 1
| #define HAVE_DLFCN_H 1
| #define STDC_HEADERS 1
| #define HAVE_MEMCPY 1
| #define DELICATE_TESSELATOR 1
| #define AUTO_TEXTURE 1
| #define OPENGL_10 1
| /* end confdefs.h.  */
| 
| /* Override any gcc2 internal prototype to avoid an error.  */
| #ifdef __cplusplus
| extern "C"
| #endif
| /* We use char because int might match the return type of a gcc2
|    builtin and then its argument prototype would still apply.  */
| char glGetError ();
| int
| main ()
| {
| glGetError ();
|   ;
|   return 0;
| }

Indeed, libGL.so has an undefined reference to table_noop_array:

pkg_comp:gcc49-70.conf# nm /usr/pkg/lib/libGL.so.1.2.0 | grep _noop_
                 U table_noop_array

So I looked further into the sources of MesaLib. There are object files
which reference table_noop_array but there is also a definition, so it
could work out.

.../MesaLib/default/mesa-11.2.2$ find . -name '*.o' | xargs nm | grep table_noop_
                 U table_noop_array
                 U table_noop_array
0000000000000000 D table_noop_array
                 U table_noop_array
                 U table_noop_array
                 U table_noop_array
                 U table_noop_array
                 U table_noop_array
                 U table_noop_array
                 U table_noop_array
0000000000000000 R table_noop_array
                 U table_noop_array
                 U table_noop_array
                 U table_noop_array

The definition is in
./src/mapi/.libs/shared_glapi_libglapi_impl.la-table.o and ends up in
./src/mapi/shared-glapi/.libs/libglapi.so.

Somehow a reference is sneaking in to libGL, as there are references in
./src/glx/.libs/libGL.so
./src/mapi/es1api/.libs/libGLESv1_CM.so
./src/mapi/es2api/.libs/libGLESv2.so

or, when looking in the object files,

./src/mapi/.libs/shared_glapi_libglapi_impl.la-entry.o
./src/mapi/.libs/shared_glapi_libglapi_impl.la-mapi_glapi.o
./src/mapi/.libs/es1api_libGLESv1_CM_la-entry.o
./src/mapi/.libs/shared_glapi_libglapi_impl.la-u_current.o
./src/mapi/.libs/es2api_libGLESv2_la-entry.o
./src/mapi/.libs/glapi_libglapi_impl.la-entry.o
./src/mapi/shared_glapi_libglapi_impl.la-entry.o
./src/mapi/shared_glapi_libglapi_impl.la-mapi_glapi.o
./src/mapi/es1api_libGLESv1_CM_la-entry.o
./src/mapi/es2api_libGLESv2_la-entry.o
./src/mapi/shared_glapi_libglapi_impl.la-u_current.o
./src/mapi/glapi_libglapi_impl.la-entry.o

The declaration looks to be in

./mapi/entry_x86_tls.h:extern const mapi_func table_noop_array[];

and references may be

./src/mapi/mapi_glapi.c:      memcpy(table, table_noop_array, num_entries * sizeof(mapi_func));
./src/mapi/table.h:   return (const struct mapi_table *) table_noop_array;


./mapi/entry_x86_tls.h:

#ifdef __NetBSD__
extern const mapi_func table_noop_array[];
#define STUB_ASM_CODE(slot)      \
   "call x86_current_tls\n\t"    \
   "movl %gs:(%eax), %eax\n\t"   \
   "testl %eax, %eax\n\t"        \
   "je 1f\n\t"                   \
   "jmp *(4 * " slot ")(%eax)\n\t" \
   "1:\n\t"                      \
   "call 2f\n"                   \
   "2:\n\t"                      \
   "popl %eax\n\t"               \
   "addl $_GLOBAL_OFFSET_TABLE_+[.-1b], %eax\n\t" \
   "movl table_noop_array@GOT(%eax), %eax\n\t" \
   "jmp *(4 * " slot ")(%eax)"
#else


./mapi/entry_x86-64_tls.h:

#ifdef __NetBSD__
#define STUB_ASM_CODE(slot)                              \
   "movq " ENTRY_CURRENT_TABLE "@GOTTPOFF(%rip), %rax\n\t"  \
   "movq %fs:(%rax), %r11\n\t"                           \
   "testq %r11, %r11\n\t"                                \
   "cmoveq table_noop_array@GOTPCREL(%rip), %r11\n\t"    \
   "jmp *(8 * " slot ")(%r11)"
#else


so stuff with tls = thread local storage?

It looks like these __NetBSD__ hacks cause the undef'd symbol.

How to fix this?

-Olaf.
-- 
___ Olaf 'Rhialto' Seibert  -- Wayland: Those who don't understand X
\X/ rhialto/at/falu.nl      -- are condemned to reinvent it. Poorly.

Attachment: signature.asc
Description: PGP signature



Home | Main Index | Thread Index | Old Index