1 dnl Check whether target compiler is working
2 AC_DEFUN(grub_PROG_TARGET_CC,
3 [AC_MSG_CHECKING([whether target compiler is working])
4 AC_CACHE_VAL(grub_cv_prog_target_cc,
6 grub_cv_prog_target_cc=yes,
7 grub_cv_prog_target_cc=no)
9 AC_MSG_RESULT([$grub_cv_prog_target_cc])
11 if test "x$grub_cv_prog_target_cc" = xno; then
12 AC_MSG_ERROR([cannot compile for the target])
17 dnl grub_ASM_USCORE checks if C symbols get an underscore after
18 dnl compiling to assembler.
19 dnl Written by Pavel Roskin. Based on grub_ASM_EXT_C written by
20 dnl Erich Boleyn and modified by Yoshinori K. Okuji.
21 AC_DEFUN(grub_ASM_USCORE,
22 [AC_REQUIRE([AC_PROG_CC])
23 AC_MSG_CHECKING([if C symbols get an underscore after compilation])
24 AC_CACHE_VAL(grub_cv_asm_uscore,
25 [cat > conftest.c <<\EOF
34 if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -S conftest.c]) && test -s conftest.s; then
37 AC_MSG_ERROR([${CC-cc} failed to produce assembly code])
40 if grep _func conftest.s >/dev/null 2>&1; then
41 grub_cv_asm_uscore=yes
48 if test "x$grub_cv_asm_uscore" = xyes; then
49 AC_DEFINE_UNQUOTED([HAVE_ASM_USCORE], $grub_cv_asm_uscore,
50 [Define if C symbols get an underscore after compilation])
53 AC_MSG_RESULT([$grub_cv_asm_uscore])
57 dnl Some versions of `objcopy -O binary' vary their output depending
58 dnl on the link address.
59 AC_DEFUN(grub_PROG_OBJCOPY_ABSOLUTE,
60 [AC_MSG_CHECKING([whether ${OBJCOPY} works for absolute addresses])
61 AC_CACHE_VAL(grub_cv_prog_objcopy_absolute,
62 [cat > conftest.c <<\EOF
66 *((int *) 0x1000) = 2;
70 if AC_TRY_EVAL(ac_compile) && test -s conftest.o; then :
72 AC_MSG_ERROR([${CC-cc} cannot compile C source code])
74 grub_cv_prog_objcopy_absolute=yes
75 for link_addr in 2000 8000 7C00; do
76 if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -nostdlib ${TARGET_IMG_LDFLAGS_AC} -Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec]); then :
78 AC_MSG_ERROR([${CC-cc} cannot link at address $link_addr])
80 if AC_TRY_COMMAND([${OBJCOPY-objcopy} --only-section=.text -O binary conftest.exec conftest]); then :
82 AC_MSG_ERROR([${OBJCOPY-objcopy} cannot create binary files])
84 if test ! -f conftest.old || AC_TRY_COMMAND([cmp -s conftest.old conftest]); then
85 mv -f conftest conftest.old
87 grub_cv_prog_objcopy_absolute=no
92 AC_MSG_RESULT([$grub_cv_prog_objcopy_absolute])
94 if test "x$grub_cv_prog_objcopy_absolute" = xno; then
95 AC_MSG_ERROR([GRUB requires a working absolute objcopy; upgrade your binutils])
100 dnl Supply --build-id=none to ld if building modules.
101 dnl This suppresses warnings from ld on some systems
102 AC_DEFUN(grub_PROG_LD_BUILD_ID_NONE,
103 [AC_MSG_CHECKING([whether linker accepts --build-id=none])
104 AC_CACHE_VAL(grub_cv_prog_ld_build_id_none,
105 [save_LDFLAGS="$LDFLAGS"
106 LDFLAGS="$LDFLAGS -Wl,--build-id=none"
108 grub_cv_prog_ld_build_id_none=yes,
109 grub_cv_prog_ld_build_id_none=no)
110 LDFLAGS="$save_LDFLAGS"
112 AC_MSG_RESULT([$grub_cv_prog_ld_build_id_none])
114 if test "x$grub_cv_prog_ld_build_id_none" = xyes; then
115 MODULE_LDFLAGS="$MODULE_LDFLAGS -Wl,--build-id=none"
121 dnl Older versions of GAS interpret `.code16' to mean ``generate 32-bit
122 dnl instructions, but implicitly insert addr32 and data32 bytes so
123 dnl that the code works in real mode''.
125 dnl Newer versions of GAS interpret `.code16' to mean ``generate 16-bit
126 dnl instructions,'' which seems right. This requires the programmer
127 dnl to explicitly insert addr32 and data32 instructions when they want
130 dnl We only support the newer versions, because the old versions cause
131 dnl major pain, by requiring manual assembly to get 16-bit instructions into
133 AC_DEFUN(grub_I386_ASM_ADDR32,
134 [AC_REQUIRE([AC_PROG_CC])
135 AC_REQUIRE([grub_I386_ASM_PREFIX_REQUIREMENT])
136 AC_MSG_CHECKING([for .code16 addr32 assembler support])
137 AC_CACHE_VAL(grub_cv_i386_asm_addr32,
138 [cat > conftest.s.in <<\EOF
140 l1: @ADDR32@ movb %al, l1
143 if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
144 sed -e s/@ADDR32@/addr32/ < conftest.s.in > conftest.s
146 sed -e s/@ADDR32@/addr32\;/ < conftest.s.in > conftest.s
149 if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
150 grub_cv_i386_asm_addr32=yes
152 grub_cv_i386_asm_addr32=no
157 AC_MSG_RESULT([$grub_cv_i386_asm_addr32])])
160 dnl Later versions of GAS requires that addr32 and data32 prefixes
161 dnl appear in the same lines as the instructions they modify, while
162 dnl earlier versions requires that they appear in separate lines.
163 AC_DEFUN(grub_I386_ASM_PREFIX_REQUIREMENT,
164 [AC_REQUIRE([AC_PROG_CC])
166 [whether addr32 must be in the same line as the instruction])
167 AC_CACHE_VAL(grub_cv_i386_asm_prefix_requirement,
168 [cat > conftest.s <<\EOF
170 l1: addr32 movb %al, l1
173 if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
174 grub_cv_i386_asm_prefix_requirement=yes
176 grub_cv_i386_asm_prefix_requirement=no
181 if test "x$grub_cv_i386_asm_prefix_requirement" = xyes; then
182 grub_tmp_addr32="addr32"
183 grub_tmp_data32="data32"
185 grub_tmp_addr32="addr32;"
186 grub_tmp_data32="data32;"
189 AC_DEFINE_UNQUOTED([ADDR32], $grub_tmp_addr32,
190 [Define it to \"addr32\" or \"addr32;\" to make GAS happy])
191 AC_DEFINE_UNQUOTED([DATA32], $grub_tmp_data32,
192 [Define it to \"data32\" or \"data32;\" to make GAS happy])
194 AC_MSG_RESULT([$grub_cv_i386_asm_prefix_requirement])])
197 dnl Older versions of GAS require that absolute indirect calls/jumps are
198 dnl not prefixed with `*', while later versions warn if not prefixed.
199 AC_DEFUN(grub_I386_ASM_ABSOLUTE_WITHOUT_ASTERISK,
200 [AC_REQUIRE([AC_PROG_CC])
202 [whether an absolute indirect call/jump must not be prefixed with an asterisk])
203 AC_CACHE_VAL(grub_cv_i386_asm_absolute_without_asterisk,
204 [cat > conftest.s <<\EOF
211 if AC_TRY_COMMAND([${CC-cc} ${CFLAGS} -c conftest.s]) && test -s conftest.o; then
212 grub_cv_i386_asm_absolute_without_asterisk=no
214 grub_cv_i386_asm_absolute_without_asterisk=yes
219 if test "x$grub_cv_i386_asm_absolute_without_asterisk" = xyes; then
220 AC_DEFINE([ABSOLUTE_WITHOUT_ASTERISK], 1,
221 [Define it if GAS requires that absolute indirect calls/jumps are not prefixed with an asterisk])
224 AC_MSG_RESULT([$grub_cv_i386_asm_absolute_without_asterisk])])
227 dnl Check what symbol is defined as a start symbol.
228 dnl Written by Yoshinori K. Okuji.
229 AC_DEFUN(grub_CHECK_START_SYMBOL,
230 [AC_REQUIRE([AC_PROG_CC])
231 AC_MSG_CHECKING([if start is defined by the compiler])
232 AC_CACHE_VAL(grub_cv_check_start_symbol,
233 [AC_TRY_LINK([], [asm ("incl start")],
234 grub_cv_check_start_symbol=yes,
235 grub_cv_check_start_symbol=no)])
237 AC_MSG_RESULT([$grub_cv_check_start_symbol])
239 AC_MSG_CHECKING([if _start is defined by the compiler])
240 AC_CACHE_VAL(grub_cv_check_uscore_start_symbol,
241 [AC_TRY_LINK([], [asm ("incl _start")],
242 grub_cv_check_uscore_start_symbol=yes,
243 grub_cv_check_uscore_start_symbol=no)])
245 AC_MSG_RESULT([$grub_cv_check_uscore_start_symbol])
247 AH_TEMPLATE([START_SYMBOL], [Define it to either start or _start])
249 if test "x$grub_cv_check_start_symbol" = xyes; then
250 AC_DEFINE([START_SYMBOL], [start])
251 elif test "x$grub_cv_check_uscore_start_symbol" = xyes; then
252 AC_DEFINE([START_SYMBOL], [_start])
254 AC_MSG_ERROR([neither start nor _start is defined])
258 dnl Check what symbol is defined as a bss start symbol.
259 dnl Written by Michael Hohmoth and Yoshinori K. Okuji.
260 AC_DEFUN(grub_CHECK_BSS_START_SYMBOL,
261 [AC_REQUIRE([AC_PROG_CC])
262 AC_MSG_CHECKING([if __bss_start is defined by the compiler])
263 AC_CACHE_VAL(grub_cv_check_uscore_uscore_bss_start_symbol,
264 [AC_TRY_LINK([], [asm ("incl __bss_start")],
265 grub_cv_check_uscore_uscore_bss_start_symbol=yes,
266 grub_cv_check_uscore_uscore_bss_start_symbol=no)])
268 AC_MSG_RESULT([$grub_cv_check_uscore_uscore_bss_start_symbol])
270 AC_MSG_CHECKING([if edata is defined by the compiler])
271 AC_CACHE_VAL(grub_cv_check_edata_symbol,
272 [AC_TRY_LINK([], [asm ("incl edata")],
273 grub_cv_check_edata_symbol=yes,
274 grub_cv_check_edata_symbol=no)])
276 AC_MSG_RESULT([$grub_cv_check_edata_symbol])
278 AC_MSG_CHECKING([if _edata is defined by the compiler])
279 AC_CACHE_VAL(grub_cv_check_uscore_edata_symbol,
280 [AC_TRY_LINK([], [asm ("incl _edata")],
281 grub_cv_check_uscore_edata_symbol=yes,
282 grub_cv_check_uscore_edata_symbol=no)])
284 AC_MSG_RESULT([$grub_cv_check_uscore_edata_symbol])
286 AH_TEMPLATE([BSS_START_SYMBOL], [Define it to one of __bss_start, edata and _edata])
288 if test "x$grub_cv_check_uscore_uscore_bss_start_symbol" = xyes; then
289 AC_DEFINE([BSS_START_SYMBOL], [__bss_start])
290 elif test "x$grub_cv_check_edata_symbol" = xyes; then
291 AC_DEFINE([BSS_START_SYMBOL], [edata])
292 elif test "x$grub_cv_check_uscore_edata_symbol" = xyes; then
293 AC_DEFINE([BSS_START_SYMBOL], [_edata])
295 AC_MSG_ERROR([none of __bss_start, edata or _edata is defined])
299 dnl Check what symbol is defined as an end symbol.
300 dnl Written by Yoshinori K. Okuji.
301 AC_DEFUN(grub_CHECK_END_SYMBOL,
302 [AC_REQUIRE([AC_PROG_CC])
303 AC_MSG_CHECKING([if end is defined by the compiler])
304 AC_CACHE_VAL(grub_cv_check_end_symbol,
305 [AC_TRY_LINK([], [asm ("incl end")],
306 grub_cv_check_end_symbol=yes,
307 grub_cv_check_end_symbol=no)])
309 AC_MSG_RESULT([$grub_cv_check_end_symbol])
311 AC_MSG_CHECKING([if _end is defined by the compiler])
312 AC_CACHE_VAL(grub_cv_check_uscore_end_symbol,
313 [AC_TRY_LINK([], [asm ("incl _end")],
314 grub_cv_check_uscore_end_symbol=yes,
315 grub_cv_check_uscore_end_symbol=no)])
317 AC_MSG_RESULT([$grub_cv_check_uscore_end_symbol])
319 AH_TEMPLATE([END_SYMBOL], [Define it to either end or _end])
321 if test "x$grub_cv_check_end_symbol" = xyes; then
322 AC_DEFINE([END_SYMBOL], [end])
323 elif test "x$grub_cv_check_uscore_end_symbol" = xyes; then
324 AC_DEFINE([END_SYMBOL], [_end])
326 AC_MSG_ERROR([neither end nor _end is defined])
330 dnl Check if the C compiler has a bug while using nested functions when
331 dnl mregparm is used on the i386. Some gcc versions do not pass the third
332 dnl parameter correctly to the nested function.
333 dnl Written by Marco Gerards.
334 AC_DEFUN(grub_I386_CHECK_REGPARM_BUG,
335 [AC_REQUIRE([AC_PROG_CC])
336 AC_MSG_CHECKING([if GCC has the regparm=3 bug])
337 AC_CACHE_VAL(grub_cv_i386_check_nested_functions,
338 [AC_RUN_IFELSE([AC_LANG_SOURCE(
347 testfunc (int __attribute__ ((__regparm__ (3))) (*hook) (int a, int b, int *c))
352 return hook (a, b, &c);
358 int __attribute__ ((__regparm__ (3))) nestedfunc (int a, int b, int *c)
360 return a == b && test (c);
362 return testfunc (nestedfunc) ? 0 : 1;
365 [grub_cv_i386_check_nested_functions=no],
366 [grub_cv_i386_check_nested_functions=yes])])
368 AC_MSG_RESULT([$grub_cv_i386_check_nested_functions])
370 if test "x$grub_cv_i386_check_nested_functions" = xyes; then
371 AC_DEFINE([NESTED_FUNC_ATTR],
372 [__attribute__ ((__regparm__ (1)))],
375 dnl Unfortunately, the above test does not detect a bug in gcc-4.0.
376 dnl So use regparm 2 until a better test is found.
377 AC_DEFINE([NESTED_FUNC_ATTR],
378 [__attribute__ ((__regparm__ (1)))],
383 dnl Check if the C compiler supports `-fstack-protector'.
384 AC_DEFUN(grub_CHECK_STACK_PROTECTOR,[
385 [# Smashing stack protector.
387 AC_MSG_CHECKING([whether `$CC' accepts `-fstack-protector'])
388 # Is this a reliable test case?
389 AC_LANG_CONFTEST([[void foo (void) { volatile char a[8]; a[3]; }]])
390 [# `$CC -c -o ...' might not be portable. But, oh, well... Is calling
391 # `ac_compile' like this correct, after all?
392 if eval "$ac_compile -S -fstack-protector -o conftest.s" 2> /dev/null; then]
394 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?
402 dnl Check if the C compiler supports `-mstack-arg-probe' (Cygwin).
403 AC_DEFUN(grub_CHECK_STACK_ARG_PROBE,[
404 [# Smashing stack arg probe.
406 AC_MSG_CHECKING([whether `$CC' accepts `-mstack-arg-probe'])
407 AC_LANG_CONFTEST([[void foo (void) { volatile char a[8]; a[3]; }]])
408 [if eval "$ac_compile -S -mstack-arg-probe -o conftest.s" 2> /dev/null; then]
410 [# Should we clear up other files as well, having called `AC_LANG_CONFTEST'?