-
Notifications
You must be signed in to change notification settings - Fork 59
Description
Originally reported downstream at pkgsrc (http://gnats.netbsd.org/55269).
The observation:
Trying to compile the "boost" meta-package in pkgsrc on NetBSD 9.0/sparc, 'bjam' always crashes with a 'bus error'. The culprit is the function timestamp_init
in tools/build/src/engine/timestamp.cpp
, which does:
time->secs = secs;
where secs
are time_t
, currently 8 bytes. This is only legal on SPARC if time->secs
is 8-bytes aligned, which it isn't, so the 8-bytes store causes a 'bus error'. The reason for the nonalignment is that it comes from the hash table implementation in hash.cpp, which does:
#define hash_item_data(item) ((HASHDATA *)((char *)item + sizeof(ITEM)))
ITEM
is the size of a pointer, and item
is properly aligned (at least 8 bytes), so this is never aligned properly with 32-bits pointers... This result in reliable crashes on 32-bits machine with strict alignment requirements (i.e., sparc).
my fix
The following patch fixes the problem for me, but might be a bit overkill (memory wastage) on 32-bits architecture that supports unaligned access. It should be a no-op on 64-bits architecture.
--- tools/build/src/engine/hash.cpp.orig 2019-12-10 01:20:17.000000000 +0100
+++ tools/build/src/engine/hash.cpp 2020-05-16 14:55:46.086210410 +0200
@@ -33,8 +33,8 @@
typedef struct item ITEM;
struct item
{
- ITEM * next;
-};
+ ITEM * next __attribute__ ((aligned (8)));
+} __attribute__ ((aligned (8)));
#define MAX_LISTS 32
There is probably better solution than that, that would generally respect alinement's rules on all platforms.