Control: reassign -1 binutils 2.25-5
Control: severity -1 important
Control: affects -1 src:fracplanet
Control: retitle -1 binutils: mips* mesa libGL.so.1 contains an invalid symbol table
Hi,
On 14/11/16 19:08, Adrian Bunk wrote:
> Package: fracplanet
> Version: 0.4.0-5
> Severity: serious
>
> https://buildd.debian.org/status/package.php?p=fracplanet&suite=sid
>
> g++ -g -O2 -fdebug-prefix-map=/«PKGBUILDDIR»=. -fstack-protector-strong -Wformat -Werror=format-security -Wl,-z,relro -Wl,-O1 -o fracplanet obj/common.o obj/control.o obj/control_about.o obj/control_render.o obj/control_save.o obj/control_terrain.o obj/dialog_documentation.o obj/fracplanet.o obj/fracplanet_main.o obj/geometry.o obj/image.o obj/license.o obj/matrix33.o obj/matrix34.o obj/noise.o obj/parameters_cloud.o obj/parameters_noise.o obj/parameters_object.o obj/parameters_render.o obj/parameters_save.o obj/parameters_terrain.o obj/progress.o obj/random.o obj/rgb.o obj/scan.o obj/spinbox.o obj/triangle.o obj/triangle_edge.o obj/triangle_mesh.o obj/triangle_mesh_cloud.o obj/triangle_mesh_terrain.o obj/triangle_mesh_viewer.o obj/triangle_mesh_viewer_display.o obj/vertex.o obj/xyz.o obj/moc_control_about.o obj/moc_control_render.o obj/moc_control_save.o obj/moc_control_terrain.o obj/moc_dialog_documentation.o obj/moc_fracplanet_main.o obj/moc_triangle_mesh_viewer.o obj/moc_triang
> le_mesh_viewer_display.o -L/usr/lib/mips-linux-gnu -L/usr/X11R6/lib -lboost_program_options -lGLU -lQtOpenGL -lQtGui -lQtCore -lGL -lpthread
> /usr/lib/mips-linux-gnu/libQtOpenGL.so: undefined reference to `glLoadMatrixd'
>
>
> Michael Biebl mentioned #844227 on IRC, are these bugs coincidence,
> or is there something that broke/changed in Mesa on mips* recently?
Looking at this a bit closer, it appears to be a longstanding binutils
bug which was recently made worse due to a change in counting local
symbols.
Dumping the dynamic symbol table of libGL.so.1 on mipsel shows the
first (long standing) bug:
$ readelf --syms libGL.so.1 | head -n15
Symbol table '.dynsym' contains 1559 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 00000000000163c0 0 SECTION LOCAL DEFAULT 10
2: 00000000000902a8 0 SECTION LOCAL DEFAULT 16
3: 0000000000072640 52 FUNC GLOBAL DEFAULT 11 glCheckFramebufferStatusE
4: 000000000006c470 52 FUNC GLOBAL DEFAULT 11 glConvolutionFilter1D
5: 0000000000072198 28 FUNC GLOBAL DEFAULT 11 glVertexAttrib3fvARB
6: 000000000006b730 52 FUNC GLOBAL DEFAULT 11 glLoadMatrixd
7: 00000000000943d0 0 NOTYPE LOCAL DEFAULT 24 _fbss
8: 000000000006c6a0 52 FUNC GLOBAL DEFAULT 11 glGetConvolutionParameter
9: 0000000000069730 52 FUNC GLOBAL DEFAULT 11 glVertex4i
10: 000000000006ebe0 52 FUNC GLOBAL DEFAULT 11 glGetBufferPointervARB
11: 000000000006e3d8 28 FUNC GLOBAL DEFAULT 11 glWindowPos2f
Here the _fbss symbol is LOCAL which is prohibited by the ELF standard
which requires all LOCAL symbols to precede GLOBAL symbols. This bug is
definitely present in jessie's binutils, because jessie's libGL also
has a symbol table similar to this. Wheezy's mesa doesn't have this bug
but I don't know if binutils definitely doesn't have it in wheezy.
Ordinarily this wasn't much of an issue since glibc and ld would just
skip LOCAL symbols when processing the symbol tables. However somewhere
between binutils 2.27-9 and 2.27.51.20161108-1 the behavior for
calculating the 'st_info' field for the .dynsym section header changed.
Recompiling mesa with both versions of binutils gives identical libGL
binaries except for this difference in the section header:
diffoscope output (- 2.27-9, + 2.27.51.20161108-1):
│ - [ 5] .dynsym DYNSYM 0000000000002e40 002e40 009228 18 A 6 3 8
│ + [ 5] .dynsym DYNSYM 0000000000002e40 002e40 009228 18 A 6 9 8
Here 3 = the index of the first non-global symbol, and 9 = the total
number of local symbols. These values should of course be equal if the
rules about symbol ordering were followed. ld uses the value of the
'st_info' field to skip LOCAL symbols when linking, which explains why
only the 5 symbols from 3-8 in the above symbol table cause link errors.
I'm still investigating, but getting a reduced testcase is quite tricky
and recompiling mesa on mips takes about an hour.
Thanks,
James
Attachment:
signature.asc
Description: OpenPGP digital signature