Bug 263845 - graphics/libglvnd: crashes on armv7 with SIGILL
Summary: graphics/libglvnd: crashes on armv7 with SIGILL
Status: New
Alias: None
Product: Ports & Packages
Classification: Unclassified
Component: Individual Port(s) (show other bugs)
Version: Latest
Hardware: arm Any
: --- Affects Some People
Assignee: freebsd-x11 (Nobody)
URL:
Keywords:
Depends on:
Blocks: 263849
  Show dependency treegraph
 
Reported: 2022-05-07 15:42 UTC by Robert Clausecker
Modified: 2022-05-07 17:49 UTC (History)
2 users (show)

See Also:
bugzilla: maintainer-feedback? (x11)


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Robert Clausecker 2022-05-07 15:42:52 UTC
The following simple program crashes with SIGILL when compiled on armv7 FreeBSD 13:

#include <GL/gl.h>
int main()
{
	glGetError();
}

I am compiling with "cc -I/usr/local/lib -L/usr/local/include test.c -lGL.  My package version is libglvnd 1.4.0_1 and I've tested this both on native armv7 and in an armv7 jail running on arm64.

The behaviour is extremely strange.  I am aware that glvnd does some sort of dispatch logic to get to the platform's native driver, but this does not match what I see.

When I try to debug this code, it seems that it is somehow iterating through the entirety of the the libGL API, only to then crash after having gone through glWriteMaskEXT.  I do not understand what the purpose of this is and it does not seem to match any code I found in the library.

Digging further into this, it seems that the library is compiled in ARM mode, but executed in Thumb mode for some reason (wtf).  I suspect this might be because the source file src/GLdispatch/vnd-glapi/entry_armv7_tsd.c uses ".thumb_func" to label the stub entry points, but then they don't get compiled in thumb mode for some reason.