Skip to content

Commit 3d77ce5

Browse files
ejohnstownphilljj
authored andcommitted
Stop the linker folding main() into a skipped test on macOS
When a test is configured out, its entry function compiles down to "return 77", the automake skip code, and the main() that forwards to it inlines to the same two instructions. Apple's ld folds the two identical bodies together and then writes LC_MAIN entryoff 0, so the binary starts executing at the Mach-O header and dies with SIGILL instead of skipping. tests/kex.test, tests/api.test and tests/auth.test all hit this under --enable-all CPPFLAGS=-DWOLFSSH_TEST_BLOCK, and kex.test hits it again under --disable-server. Probe for -Wl,-no_deduplicate and add it to AM_LDFLAGS when the linker takes it. GNU ld rejects the flag, so the check leaves Linux alone. Making the skipped body differ does not help: anything added to the entry function inlines into main() and the two fold again.
1 parent 3264022 commit 3d77ce5

1 file changed

Lines changed: 9 additions & 0 deletions

File tree

configure.ac

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,15 @@ AM_CONDITIONAL([BUILD_KEYBOARD_INTERACTIVE],[test "x$ENABLED_KEYBOARD_INTERACTIV
388388
389389
AX_HARDEN_CC_COMPILER_FLAGS
390390
391+
dnl A test that is configured out compiles down to "return 77", the automake
392+
dnl skip code, and so does the main() that forwards to it. Apple's linker folds
393+
dnl the two identical bodies together, then writes LC_MAIN entryoff 0, so the
394+
dnl binary starts executing at the Mach-O header and dies with SIGILL instead
395+
dnl of skipping. Turn the folding off where the linker understands the flag;
396+
dnl GNU ld rejects it and is unaffected.
397+
AX_CHECK_LINK_FLAG([-Wl,-no_deduplicate],
398+
[AM_LDFLAGS="$AM_LDFLAGS -Wl,-no_deduplicate"])
399+
391400
CREATE_HEX_VERSION
392401
AC_SUBST([AM_CPPFLAGS])
393402
AC_SUBST([AM_CFLAGS])

0 commit comments

Comments
 (0)