@@ -98,6 +98,71 @@ AC_ARG_ENABLE(warnings,
9898 AC_MSG_RESULT ( no )
9999)
100100
101+ # Security hardening flags (enabled by default)
102+ AC_MSG_CHECKING ( [ whether to enable security hardening] )
103+ AC_ARG_ENABLE ( hardening ,
104+ [ --disable-hardening Disable security hardening compiler flags (default: enabled)] ,
105+ [ ENABLED_HARDENING=$enableval ] ,
106+ [ ENABLED_HARDENING=yes ]
107+ )
108+ if test "$ENABLED_HARDENING" = "yes"; then
109+ AC_MSG_RESULT ( [ yes] )
110+
111+ # Warning flags that catch real bugs
112+ CFLAGS="$CFLAGS -Wall -Wshadow -Wpointer-arith -Wcast-qual -Wwrite-strings"
113+ CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes"
114+ CFLAGS="$CFLAGS -Wformat=2 -Wformat-security"
115+ CFLAGS="$CFLAGS -Wno-unused-parameter"
116+
117+ # Promote dangerous patterns to errors; catches implicit declarations and
118+ # type mismatches that are UB in C99 and silently wrong in practice.
119+ CFLAGS="$CFLAGS -Werror=implicit-function-declaration"
120+ CFLAGS="$CFLAGS -Werror=implicit-int"
121+ CFLAGS="$CFLAGS -Werror=incompatible-pointer-types"
122+ CFLAGS="$CFLAGS -Werror=int-conversion"
123+ CFLAGS="$CFLAGS -Werror=return-type"
124+ CFLAGS="$CFLAGS -Werror=format-security"
125+
126+ # Runtime protection: buffer overflow detection and stack canaries
127+ CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
128+ CFLAGS="$CFLAGS -fstack-protector-strong"
129+
130+ # Stack clash protection (GCC 8+ / Clang 11+); probe pages on large
131+ # stack allocations to prevent stack-to-heap collisions.
132+ save_CFLAGS="$CFLAGS"
133+ CFLAGS="$CFLAGS -fstack-clash-protection -Werror"
134+ AC_MSG_CHECKING ( [ whether $CC supports -fstack-clash-protection] )
135+ AC_COMPILE_IFELSE ( [ AC_LANG_PROGRAM ( ) ] ,
136+ [ AC_MSG_RESULT ( [ yes] )
137+ CFLAGS="$save_CFLAGS -fstack-clash-protection"] ,
138+ [ AC_MSG_RESULT ( [ no] )
139+ CFLAGS="$save_CFLAGS"] )
140+
141+ # Position-independent code for ASLR; hardened distros expect -pie binaries.
142+ save_CFLAGS="$CFLAGS"
143+ save_LDFLAGS="$LDFLAGS"
144+ CFLAGS="$CFLAGS -fPIE -Werror"
145+ LDFLAGS="$LDFLAGS -pie"
146+ AC_MSG_CHECKING ( [ whether $CC supports -fPIE -pie] )
147+ AC_LINK_IFELSE ( [ AC_LANG_PROGRAM ( ) ] ,
148+ [ AC_MSG_RESULT ( [ yes] )
149+ CFLAGS="$save_CFLAGS -fPIE"
150+ LDFLAGS="$save_LDFLAGS -pie"] ,
151+ [ AC_MSG_RESULT ( [ no] )
152+ CFLAGS="$save_CFLAGS"
153+ LDFLAGS="$save_LDFLAGS"] )
154+
155+ # Linker hardening: RELRO makes the GOT read-only after startup; BIND_NOW
156+ # forces all symbol resolution at load time, closing lazy-binding exploits.
157+ case $host_os in
158+ linux*)
159+ LDFLAGS="$LDFLAGS -Wl,-z,relro,-z,now"
160+ ;;
161+ esac
162+ else
163+ AC_MSG_RESULT ( [ no] )
164+ fi
165+
101166AC_PATH_PROG ( HELP2MAN , help2man , false // No help2man // )
102167AC_CHECK_PROG ( [ HELP2MAN] , [ help2man] , [ help2man] )
103168AM_CONDITIONAL([ HAVE_HELP2MAN] , [ test x$HELP2MAN = xhelp2man] )
0 commit comments