dnl Process this file with autoconf to produce a configure script
dnl
dnl   Copyright (C) 2012-2025 Free Software Foundation, Inc.
dnl
dnl This file is free software; you can redistribute it and/or modify
dnl it under the terms of the GNU General Public License as published by
dnl the Free Software Foundation; either version 3 of the License, or
dnl (at your option) any later version.
dnl
dnl This program is distributed in the hope that it will be useful,
dnl but WITHOUT ANY WARRANTY; without even the implied warranty of
dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
dnl GNU General Public License for more details.
dnl
dnl You should have received a copy of the GNU General Public License
dnl along with this program; see the file COPYING3.  If not see
dnl <http://www.gnu.org/licenses/>.
dnl

m4_include([../bfd/version.m4])
AC_INIT([ld], [BFD_VERSION])
AC_CONFIG_SRCDIR(ldmain.c)

AC_CANONICAL_TARGET
AC_CANONICAL_BUILD

AM_INIT_AUTOMAKE
AM_SILENT_RULES([yes])
AM_MAINTAINER_MODE

case $target in
  *-*-solaris2*)
    case "$SHELL" in
      *bash*)
        ;;
      *)
        # PR 32580: Force use of bash to avoid corrupt linker scripts.
        SHELL=/bin/bash
        ;;
    esac
    ;;
esac

AC_PROG_CC
AC_PROG_CXX
AC_PROG_GREP
AC_USE_SYSTEM_EXTENSIONS
AC_PROG_INSTALL
PKG_PROG_PKG_CONFIG

LT_INIT
ACX_LARGEFILE

ac_checking=
. ${srcdir}/../bfd/development.sh
test "$development" = true && ac_checking=yes
AC_ARG_ENABLE(checking,
[  --enable-checking       enable run-time checks],
[case "${enableval}" in
  no|none)  ac_checking= ;;
  *)	    ac_checking=yes ;;
esac])dnl
if test x$ac_checking != x ; then
  AC_DEFINE(ENABLE_CHECKING, 1, [Define if you want run-time sanity checks.])
fi

AC_ARG_WITH(lib-path, [  --with-lib-path=dir1:dir2...  set default LIB_PATH],LIB_PATH=$withval)
AC_ARG_ENABLE(targets,
[  --enable-targets        alternative target configurations],
[case "${enableval}" in
  yes | "") AC_MSG_ERROR(enable-targets option must specify target names or 'all')
	    ;;
  no)       enable_targets= ;;
  *)        enable_targets=$enableval ;;
esac])dnl

BFD_64_BIT

AC_ARG_WITH(sysroot,
[  --with-sysroot[=DIR] Search for usr/lib et al within DIR.],
[
 case ${with_sysroot} in
 yes) TARGET_SYSTEM_ROOT='${exec_prefix}/${target_alias}/sys-root' ;;
 *) TARGET_SYSTEM_ROOT=$with_sysroot ;;
 esac

 TARGET_SYSTEM_ROOT_DEFINE='-DTARGET_SYSTEM_ROOT=\"$(TARGET_SYSTEM_ROOT)\"'
 use_sysroot=yes

 if test "x$prefix" = xNONE; then
  test_prefix=/usr/local
 else
  test_prefix=$prefix
 fi
 if test "x$exec_prefix" = xNONE; then
  test_exec_prefix=$test_prefix
 else
  test_exec_prefix=$exec_prefix
 fi
 case ${TARGET_SYSTEM_ROOT} in
 "${test_prefix}"|"${test_prefix}/"*|\
 "${test_exec_prefix}"|"${test_exec_prefix}/"*|\
 '${prefix}'|'${prefix}/'*|\
 '${exec_prefix}'|'${exec_prefix}/'*)
   t="$TARGET_SYSTEM_ROOT_DEFINE -DTARGET_SYSTEM_ROOT_RELOCATABLE"
   TARGET_SYSTEM_ROOT_DEFINE="$t"
   ;;
 esac
], [
 use_sysroot=no
 TARGET_SYSTEM_ROOT=
 TARGET_SYSTEM_ROOT_DEFINE='-DTARGET_SYSTEM_ROOT=\"\"'
])
AC_SUBST(use_sysroot)
AC_SUBST(TARGET_SYSTEM_ROOT)
AC_SUBST(TARGET_SYSTEM_ROOT_DEFINE)

dnl Use --enable-gold to decide if this linker should be the default.
dnl "install_as_default" is set to false if gold is the default linker.
dnl "installed_linker" is the installed BFD linker name.
AC_ARG_ENABLE(gold,
[[  --enable-gold[=ARG]     build gold [ARG={default,yes,no}]]],
[case "${enableval}" in
 default)
   install_as_default=no
   installed_linker=ld.bfd
   ;;
 yes|no)
   install_as_default=yes
   installed_linker=ld.bfd
   ;;
 *)
   AC_MSG_ERROR([invalid --enable-gold argument])
   ;;
 esac],
[install_as_default=yes
 installed_linker=ld.bfd])
AC_SUBST(install_as_default)
AC_SUBST(installed_linker)

AC_ARG_ENABLE([got],
AS_HELP_STRING([--enable-got=<type>],
	       [GOT handling scheme (target, single, negative, multigot)]),
[case "${enableval}" in
  target | single | negative | multigot)  got_handling=$enableval ;;
  *)  AC_MSG_ERROR(bad value ${enableval} for --enable-got option) ;;
esac],
[got_handling=target])

case "${got_handling}" in
  target)
    AC_DEFINE([GOT_HANDLING_DEFAULT], [GOT_HANDLING_TARGET_DEFAULT],
	      [Define to choose default GOT handling scheme]) ;;
  single)
    AC_DEFINE([GOT_HANDLING_DEFAULT], [GOT_HANDLING_SINGLE],
	      [Define to choose default GOT handling scheme]) ;;
  negative)
    AC_DEFINE([GOT_HANDLING_DEFAULT], [GOT_HANDLING_NEGATIVE],
	      [Define to choose default GOT handling scheme]) ;;
  multigot)
    AC_DEFINE([GOT_HANDLING_DEFAULT], [GOT_HANDLING_MULTIGOT],
	      [Define to choose default GOT handling scheme]) ;;
  *)  AC_MSG_ERROR(bad value ${got_handling} for --enable-got option) ;;
esac

# PR gas/19109
# Decide the default method for compressing debug sections.
ac_default_compressed_debug_sections=unset
# Provide a configure time option to override our default.
AC_ARG_ENABLE(compressed_debug_sections,
	      AS_HELP_STRING([--enable-compressed-debug-sections={all,ld,none}],
	      [compress debug sections by default])],
[case ,"${enableval}", in
  ,yes, | ,all, | *,ld,*) ac_default_compressed_debug_sections=yes ;;
  ,no, | ,none,)  ac_default_compressed_debug_sections=no ;;
esac])dnl

# Select default compression algorithm.
ac_default_compressed_debug_sections_algorithm=COMPRESS_DEBUG_GABI_ZLIB
AC_ARG_ENABLE(default_compressed_debug_sections_algorithm,
	      AS_HELP_STRING([--enable-default-compressed-debug-sections-algorithm={zlib,zstd}],
	      [Default compression algorithm for --enable-compressed-debug-sections.]),
[case "${enableval}" in
   zstd) ac_default_compressed_debug_sections_algorithm=COMPRESS_DEBUG_ZSTD ;;
esac])dnl

# Decide setting DT_RUNPATH instead of DT_RPATH by default
ac_default_new_dtags=unset
# Provide a configure time option to override our default.
AC_ARG_ENABLE(new_dtags,
	      AS_HELP_STRING([--enable-new-dtags],
	      [set DT_RUNPATH instead of DT_RPATH by default])],
[case "${enableval}" in
  yes) ac_default_new_dtags=1 ;;
  no) ac_default_new_dtags=0 ;;
esac])dnl

# Decide if -z relro should be enabled in ELF linker by default.
ac_default_ld_z_relro=unset
# Provide a configure time option to override our default.
AC_ARG_ENABLE(relro,
	      AS_HELP_STRING([--enable-relro],
	      [enable -z relro in ELF linker by default]),
[case "${enableval}" in
  yes)  ac_default_ld_z_relro=1 ;;
  no)  ac_default_ld_z_relro=0 ;;
esac])dnl

# Decide if DT_TEXTREL check should be enabled in ELF linker.
ac_default_ld_textrel_check=unset
AC_ARG_ENABLE([textrel-check],
	      AS_HELP_STRING([--enable-textrel-check=@<:@yes|no|warning|error@:>@],
			     [enable DT_TEXTREL check in ELF linker]),
[case "${enableval}" in
  yes|no|warning|error) ac_default_ld_textrel_check=${enableval} ;;
esac])

# Decide if -z separate-code should be enabled in ELF linker by default.
ac_default_ld_z_separate_code=unset
AC_ARG_ENABLE(separate-code,
	      AS_HELP_STRING([--enable-separate-code],
	      [enable -z separate-code in ELF linker by default]),
[case "${enableval}" in
  yes) ac_default_ld_z_separate_code=1 ;;
  no) ac_default_ld_z_separate_code=0 ;;
esac])

# Decide if --rosegment should be enabled in the ELF linker by default.
ac_default_ld_rosegment=unset
AC_ARG_ENABLE(rosegment,
	      AS_HELP_STRING([--enable-rosegment],
	      [enable --rosegment in the ELF linker by default]),
[case "${enableval}" in
  yes) ac_default_ld_rosegment=1 ;;
  no)  ac_default_ld_rosegment=0 ;;
esac])

# Decide if -z mark-plt should be enabled in ELF x86-64 linker by default.
ac_default_ld_z_mark_plt=unset
AC_ARG_ENABLE(mark-plt,
	      AS_HELP_STRING([--enable-mark-plt],
	      [enable -z mark-plt in ELF x86-64 linker by default]),
[case "${enableval}" in
  yes) ac_default_ld_z_mark_plt=1 ;;
  no) ac_default_ld_z_mark_plt=0 ;;
esac])

# Decide if -z memory-seal should be enabled in ELF linker by default.
ac_default_ld_z_memory_seal=unset
AC_ARG_ENABLE(memory-seal,
	      AS_HELP_STRING([--enable-memory-seal],
	      [enable -z memory-seal in ELF linker by default]),
[case "${enableval}" in
  yes) ac_default_ld_z_memory_seal=1 ;;
  no) ac_default_ld_z_memory_seal=0 ;;
esac])


# By default warn when an executable stack is created due to object files
# requesting such, not when the user specifies -z execstack.
ac_default_ld_warn_execstack=2
AC_ARG_ENABLE(warn-execstack,
	      AS_HELP_STRING([--enable-warn-execstack],
	      [enable warnings when creating an executable stack]),
[case "${enableval}" in
  yes) ac_default_ld_warn_execstack=1 ;;
  no)  ac_default_ld_warn_execstack=0 ;;
esac])

ac_default_ld_error_execstack=0
AC_ARG_ENABLE(error-execstack,
	      AS_HELP_STRING([--enable-error-execstack],
	      [turn executable stack warnings into errors]),
[case "${enableval}" in
  yes) ac_default_ld_error_execstack=1 ;;
  no)  ac_default_ld_error_execstack=0 ;;
esac])

ac_default_ld_warn_rwx_segments=unset
AC_ARG_ENABLE(warn-rwx-segments,
	      AS_HELP_STRING([--enable-warn-rwx-segments],
	      [enable warnings when creating segments with RWX permissions]),
[case "${enableval}" in
  yes) ac_default_ld_warn_rwx_segments=1 ;;
  no)  ac_default_ld_warn_rwx_segments=0 ;;
esac])

ac_default_ld_error_rwx_segments=0
AC_ARG_ENABLE(error-rwx-segments,
	      AS_HELP_STRING([--enable-error-rwx-segments],
	      [turn executable segment warnings into errors]),
[case "${enableval}" in
  yes) ac_default_ld_error_rwx_segments=1 ;;
  no)  ac_default_ld_error_rwx_segments=0 ;;
esac])

ac_default_ld_default_execstack=unset
AC_ARG_ENABLE(default-execstack,
	      AS_HELP_STRING([--enable-default-execstack],
	      [create an executable stack if an input file is missing a .note.GNU-stack section]),
[case "${enableval}" in
  yes) ac_default_ld_default_execstack=1 ;;
  no)  ac_default_ld_default_execstack=0 ;;
esac])


# Decide if --error-handling-script should be supported.
ac_support_error_handling_script=unset
AC_ARG_ENABLE(error-handling-script,
	      AS_HELP_STRING([--enable-error-handling-script],
	      [enable/disable support for the --error-handling-script option]),
[case "${enableval}" in
  yes) ac_support_error_handling_script=1 ;;
  no)  ac_support_error_handling_script=0 ;;
esac])

# Decide which "--hash-style" to use by default
# Provide a configure time option to override our default.
AC_ARG_ENABLE([default-hash-style],
AS_HELP_STRING([--enable-default-hash-style={sysv,gnu,both}],
	       [use this default hash style]),
[case "${enable_default_hash_style}" in
  sysv | gnu | both) ;;
  *) AC_MSG_ERROR([bad value ${enable_default_hash_style} for enable-default-hash-style option]) ;;
esac],
[case "${target}" in
  # Enable gnu hash only on GNU targets, but not mips
  mips*-*-*) enable_default_hash_style=sysv ;;
  *-*-gnu* | *-*-linux*) enable_default_hash_style=both ;;
  *) enable_default_hash_style=sysv ;;
esac])

case "${enable_default_hash_style}" in
  sysv | both) ac_default_emit_sysv_hash=1 ;;
  *) ac_default_emit_sysv_hash=0 ;;
esac

case "${enable_default_hash_style}" in
  gnu | both) ac_default_emit_gnu_hash=1 ;;
  *) ac_default_emit_gnu_hash=0 ;;
esac

AC_ARG_ENABLE(initfini-array,
[  --disable-initfini-array do not use .init_array/.fini_array sections],
[case "${enableval}" in
 yes|no) ;;
 *) AC_MSG_ERROR([invalid --enable-initfini-array argument]) ;;
 esac], [enable_initfini_array=yes])
AC_SUBST(enable_initfini_array)
if test $enable_initfini_array = yes; then
  AC_DEFINE(HAVE_INITFINI_ARRAY, 1,
    [Define .init_array/.fini_array sections are available and working.])
fi

GCC_ENABLE([libctf], [yes], [], [Handle .ctf type-info sections])
if test "${enable_libctf}" = yes; then
    AC_DEFINE(ENABLE_LIBCTF, 1, [Handle .ctf type-info sections])
fi
AM_CONDITIONAL(ENABLE_LIBCTF, test "${enable_libctf}" = yes)
AC_SUBST(enable_libctf)

# Used to validate --package-metadata= input. Disabled by default.
AC_ARG_ENABLE([jansson],
  [AS_HELP_STRING([--enable-jansson],
    [enable jansson [default=no]])],
  [enable_jansson=$enableval],
  [enable_jansson="no"])

AS_IF([test "x$enable_jansson" != "xno"],
  [PKG_CHECK_MODULES(JANSSON, [jansson],
    [
      AC_DEFINE(HAVE_JANSSON, 1, [The jansson library is to be used])
      AC_SUBST([JANSSON_CFLAGS])
      AC_SUBST([JANSSON_LIBS])
    ],
    [AC_MSG_ERROR([Cannot find jansson library])])
  ])

AM_BINUTILS_WARNINGS

AM_LC_MESSAGES

AC_CONFIG_HEADERS([config.h:config.in])

# PR 14072
AH_VERBATIM([00_CONFIG_H_CHECK],
[/* Check that config.h is #included before system headers
   (this works only for glibc, but that should be enough).  */
#if defined(__GLIBC__) && !defined(__FreeBSD_kernel__) && !defined(__CONFIG_H__)
#  error config.h must be #included before system headers
#endif
#define __CONFIG_H__ 1])

if test -z "$target" ; then
    AC_MSG_ERROR(Unrecognized target system type; please check config.sub.)
fi
if test -z "$host" ; then
    AC_MSG_ERROR(Unrecognized host system type; please check config.sub.)
fi

# host-specific stuff:

ALL_LINGUAS="bg da de es fi fr ga id it ja pt_BR ru sr sv tr uk vi zh_CN zh_TW"
ZW_GNU_GETTEXT_SISTER_DIR

AC_EXEEXT

AC_PROG_YACC
AM_PROG_LEX

AM_MAINTAINER_MODE
AM_CONDITIONAL(GENINSRC_NEVER, false)
ACX_PROG_CMP_IGNORE_INITIAL

. ${srcdir}/configure.host

AC_SUBST(HDEFINES)
AC_SUBST(NATIVE_LIB_DIRS)

# We use headers from include/ that check various HAVE_*_H macros, thus
# should ensure they are set by configure.  This is true even when C99
# guarantees they are available.
# sha1.h and md4.h test HAVE_LIMITS_H, HAVE_SYS_TYPES_H and HAVE_STDINT_H
# plugin-api.h tests HAVE_STDINT_H and HAVE_INTTYPES_H
# Besides those, we need to check anything used in ld/ not in C99.
AC_CHECK_HEADERS(fcntl.h elf-hints.h limits.h inttypes.h stdint.h \
		 sys/file.h sys/mman.h sys/param.h sys/stat.h sys/time.h \
		 sys/types.h unistd.h)
AC_CHECK_FUNCS(close getrusage glob lseek mkstemp open realpath waitpid)

BFD_BINARY_FOPEN

AC_CHECK_DECLS([environ, stpcpy])

GCC_AC_FUNC_MMAP

AC_SEARCH_LIBS([dlopen], [dl])

AC_MSG_CHECKING(for a known getopt prototype in unistd.h)
AC_CACHE_VAL(ld_cv_decl_getopt_unistd_h,
[AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <unistd.h>], [extern int getopt (int, char *const*, const char *);])],
ld_cv_decl_getopt_unistd_h=yes, ld_cv_decl_getopt_unistd_h=no)])
AC_MSG_RESULT($ld_cv_decl_getopt_unistd_h)
if test $ld_cv_decl_getopt_unistd_h = yes; then
  AC_DEFINE([HAVE_DECL_GETOPT], 1,
	    [Is the prototype for getopt in <unistd.h> in the expected format?])
fi

dnl xxhash support from gdbsupport/common.m4
AC_MSG_CHECKING([whether to use xxhash])
AC_ARG_WITH(xxhash,
  AS_HELP_STRING([--with-xxhash], [use inlined libxxhash for hashing (faster) (auto/yes/no)]),
  [], [with_xxhash=auto])
if test "x$with_xxhash" != "xno"; then
  AC_COMPILE_IFELSE([AC_LANG_SOURCE([
#define XXH_INLINE_ALL
#include <xxhash.h>
XXH128_hash_t r;
void foo (void) { r = XXH128("foo", 3, 0); }
])],[
  with_xxhash=yes
  AC_DEFINE([WITH_XXHASH], 1, [whether to use inline xxhash])
],[
  if test "$with_xxhash" = yes; then
    AC_MSG_ERROR([xxhash is missing or unusable])
  fi
  with_xxhash=no])
fi
AC_MSG_RESULT([$with_xxhash])

# Link in zlib/zstd if we can.  This allows us to read and write
# compressed debug sections.
AM_ZLIB
AC_ZSTD

# target-specific stuff:

all_targets=
EMUL=
all_emuls=
all_emul_extras=
all_libpath=
TDIRS=

elf_list_options=false
elf_shlib_list_options=false
elf_plt_unwind_list_options=false
for targ_alias in `echo $target_alias $enable_targets | sed 's/,/ /g'`
do
  if test "$targ_alias" = "all"; then
    all_targets=true
    elf_list_options=true
    elf_shlib_list_options=true
    elf_plt_unwind_list_options=true
  else
    # Canonicalize the secondary target names.
    result=`$ac_config_sub $targ_alias 2>/dev/null`
    if test -n "$result"; then
	targ=$result
    else
	targ=$targ_alias
    fi

    . ${srcdir}/configure.tgt

    if test "$targ" = "$target"; then
      EMUL=$targ_emul
    fi

    if test x${have_64_bit_bfd} = xno; then
      . ${srcdir}/../bfd/config.bfd
    fi

    if test x${have_64_bit_bfd} = xyes; then
      targ_extra_emuls="$targ_extra_emuls $targ64_extra_emuls"
      targ_extra_libpath="$targ_extra_libpath $targ64_extra_libpath"
    fi

    for i in $targ_emul $targ_extra_emuls $targ_extra_libpath; do
	case " $all_emuls " in
	*" e${i}.o "*) ;;
	*)
	  all_emuls="$all_emuls e${i}.o"
	  eval result=\$tdir_$i
	  test -z "$result" && result=$targ_alias
	  TDIRS="$TDIRS
tdir_$i=$result"
	  case "${i}" in
	  *elf*)
	    elf_list_options=true
	    ;;
	  *)
	    if $GREP "TEMPLATE_NAME=elf" ${srcdir}/emulparams/${i}.sh >/dev/null 2>/dev/null; then
	      elf_list_options=true
	    fi
	    ;;
	  esac
	  if test "$elf_list_options" = "true"; then
	    source_sh()
	    {
	      . $1
	    }
	    source_sh ${srcdir}/emulparams/${i}.sh
	    if test x${GENERATE_SHLIB_SCRIPT} = xyes; then
	      elf_shlib_list_options=true
	    fi
	    if test x${PLT_UNWIND} = xyes; then
	      elf_plt_unwind_list_options=true
	    fi
	  fi
	  ;;
	esac
    done

    for i in $targ_emul $targ_extra_libpath; do
	case " $all_libpath " in
	*" ${i} "*) ;;
	*)
	  if test -z "$all_libpath"; then
	    all_libpath=${i}
	  else
	    all_libpath="$all_libpath ${i}"
	  fi
	  ;;
	esac
    done

    for i in $targ_extra_ofiles; do
	case " $all_emul_extras " in
	*" ${i} "*) ;;
	*)
	  all_emul_extras="$all_emul_extras ${i}"
	  ;;
	esac
    done

  fi
done

if test x$ac_default_compressed_debug_sections = xyes ; then
  AC_DEFINE(DEFAULT_FLAG_COMPRESS_DEBUG, 1, [Define if you want compressed debug sections by default.])
fi

AC_DEFINE_UNQUOTED(DEFAULT_COMPRESSED_DEBUG_ALGORITHM, $ac_default_compressed_debug_sections_algorithm,
		   [Default compression algorithm for --enable-compressed-debug-sections.])

if test "${ac_default_new_dtags}" = unset; then
  ac_default_new_dtags=0
fi
AC_DEFINE_UNQUOTED(DEFAULT_NEW_DTAGS,
  $ac_default_new_dtags,
  [Define to 1 if you want to set DT_RUNPATH instead of DT_RPATH by default.])

if test "${ac_default_ld_z_relro}" = unset; then
  ac_default_ld_z_relro=0
fi
AC_DEFINE_UNQUOTED(DEFAULT_LD_Z_RELRO,
  $ac_default_ld_z_relro,
  [Define to 1 if you want to enable -z relro in ELF linker by default.])

ac_default_ld_textrel_check_warning=0
case "${ac_default_ld_textrel_check}" in
  unset|no)
    ac_default_ld_textrel_check=textrel_check_none
    ;;
  yes|warning)
    ac_default_ld_textrel_check=textrel_check_warning
    ac_default_ld_textrel_check_warning=1
    ;;
  error)
    ac_default_ld_textrel_check=textrel_check_error
    ;;
esac
AC_DEFINE_UNQUOTED(DEFAULT_LD_TEXTREL_CHECK,
  $ac_default_ld_textrel_check,
  [The default method for DT_TEXTREL check in ELF linker.])
AC_DEFINE_UNQUOTED(DEFAULT_LD_TEXTREL_CHECK_WARNING,
  $ac_default_ld_textrel_check_warning,
  [Define to 1 if DT_TEXTREL check is warning in ELF linker by default.])

if test "${ac_default_ld_z_separate_code}" = unset; then
  ac_default_ld_z_separate_code=0
fi
AC_DEFINE_UNQUOTED(DEFAULT_LD_Z_SEPARATE_CODE,
  $ac_default_ld_z_separate_code,
  [Define to 1 if you want to enable -z separate-code in ELF linker by default.])

if test "${ac_default_ld_rosegment}" = unset; then
  ac_default_ld_rosegment=0
fi
AC_DEFINE_UNQUOTED(DEFAULT_LD_ROSEGMENT,
  $ac_default_ld_rosegment,
  [Define to 1 if you want to enable --rosegment in the ELF linker by default.])

if test "${ac_default_ld_z_mark_plt}" = unset; then
  ac_default_ld_z_mark_plt=0
fi
AC_DEFINE_UNQUOTED(DEFAULT_LD_Z_MARK_PLT,
  $ac_default_ld_z_mark_plt,
  [Define to 1 if you want to enable -z mark-plt in ELF x86-64 linker by default.])

if test "${ac_default_ld_z_memory_seal}" = unset; then
  ac_default_ld_z_memory_seal=0
fi
AC_DEFINE_UNQUOTED(DEFAULT_LD_Z_MEMORY_SEAL,
  $ac_default_ld_z_memory_seal,
  [Define to 1 if you want to enable -z memory_seal in ELF linker by default.])


AC_DEFINE_UNQUOTED(DEFAULT_LD_WARN_EXECSTACK,
  $ac_default_ld_warn_execstack,
  [Define to 1 if you want to enable --warn-execstack in ELF linker by default.])

AC_DEFINE_UNQUOTED(DEFAULT_LD_ERROR_EXECSTACK,
  $ac_default_ld_error_execstack,
  [Define to 1 if you want to turn executable stack warnings into errors by default.])

if test "${ac_default_ld_warn_rwx_segments}" = unset; then
  ac_default_ld_warn_rwx_segments=1
fi
AC_DEFINE_UNQUOTED(DEFAULT_LD_WARN_RWX_SEGMENTS,
  $ac_default_ld_warn_rwx_segments,
  [Define to 0 if you want to disable --warn-rwx-segments in ELF linker by default.])

AC_DEFINE_UNQUOTED(DEFAULT_LD_ERROR_RWX_SEGMENTS,
  $ac_default_ld_error_rwx_segments,
  [Define to 1 if you want to turn executable segment warnings into errors by default.])

if test "${ac_default_ld_default_execstack}" = unset; then
  ac_default_ld_default_execstack=1
fi
AC_DEFINE_UNQUOTED(DEFAULT_LD_EXECSTACK,
  $ac_default_ld_default_execstack,
  [Define to 0 if you want to disable the generation of an executable stack when a .note-GNU-stack section is missing.])


if test "${ac_support_error_handling_script}" = unset; then
  ac_support_error_handling_script=1
fi
AC_DEFINE_UNQUOTED(SUPPORT_ERROR_HANDLING_SCRIPT,
  $ac_support_error_handling_script,
  [Define to 1 if you want to support the --error-handling-script command line option.])

AC_DEFINE_UNQUOTED([DEFAULT_EMIT_SYSV_HASH],
  [$ac_default_emit_sysv_hash],
  [Define to 1 if you want to emit sysv hash in the ELF linker by default.])

AC_DEFINE_UNQUOTED([DEFAULT_EMIT_GNU_HASH],
  [$ac_default_emit_gnu_hash],
  [Define to 1 if you want to emit gnu hash in the ELF linker by default.])

AC_SUBST(elf_list_options)
AC_SUBST(elf_shlib_list_options)
AC_SUBST(elf_plt_unwind_list_options)
AC_SUBST(EMUL)

AC_SUBST(TDIRS)
AM_SUBST_NOTMAKE(TDIRS)

if test x${all_targets} = xtrue; then
  if test x${have_64_bit_bfd} = xyes; then
    EMULATION_OFILES='$(ALL_EMULATIONS) $(ALL_64_EMULATIONS)'
    EMUL_EXTRA_OFILES='$(ALL_EMUL_EXTRA_OFILES) $(ALL_64_EMUL_EXTRA_OFILES)'
  else
    EMULATION_OFILES='$(ALL_EMULATIONS)'
    EMUL_EXTRA_OFILES='$(ALL_EMUL_EXTRA_OFILES)'
  fi
else
  EMULATION_OFILES=$all_emuls
  EMUL_EXTRA_OFILES=$all_emul_extras
fi
AC_SUBST(EMULATION_OFILES)
AC_SUBST(EMUL_EXTRA_OFILES)
AC_SUBST(LIB_PATH)

EMULATION_LIBPATH=$all_libpath
AC_SUBST(EMULATION_LIBPATH)

if test x${enable_static} = xno; then
  TESTBFDLIB="-Wl,--rpath,../bfd/.libs ../bfd/.libs/libbfd.so"
  TESTCTFLIB="-Wl,--rpath,../libctf/.libs ../libctf/.libs/libctf.so"
  TESTSFRAMELIB="-Wl,--rpath,../libsframe/.libs ../libsframe/.libs/libsframe.so"
else
  TESTBFDLIB="../bfd/.libs/libbfd.a"
  TESTCTFLIB="../libctf/.libs/libctf.a"
  TESTSFRAMELIB="../libsframe/.libs/libsframe.a"
fi
if test "${enable_libctf}" = no; then
    TESTCTFLIB=
fi
AC_SUBST(TESTBFDLIB)
AC_SUBST(TESTCTFLIB)
AC_SUBST(TESTSFRAMELIB)

target_vendor=${target_vendor=$host_vendor}
case "$target_vendor" in
  hp) EXTRA_SHLIB_EXTENSION=".sl" ;;
  *)  EXTRA_SHLIB_EXTENSION= ;;
esac

case "$target_os" in
  lynxos) EXTRA_SHLIB_EXTENSION=".a" ;;
esac

if test x${EXTRA_SHLIB_EXTENSION} != x ; then
  AC_DEFINE_UNQUOTED(EXTRA_SHLIB_EXTENSION, "$EXTRA_SHLIB_EXTENSION",
   [Additional extension a shared object might have.])
fi

AC_CONFIG_COMMANDS([default],
[[
case "$srcdir" in
  .) srcdirpre= ;;
  *) srcdirpre='$(srcdir)/' ;;
esac
POFILES=
GMOFILES=
for lang in dummy $OBSOLETE_ALL_LINGUAS; do
  if test $lang != dummy; then
    POFILES="$POFILES $srcdirpre$lang.po"
    GMOFILES="$GMOFILES $srcdirpre$lang.gmo"
  fi
done
sed -e '/^SRC-POTFILES =/r po/SRC-POTFILES' \
    -e '/^BLD-POTFILES =/r po/BLD-POTFILES' \
    -e "s,@POFILES@,$POFILES," \
    -e "s,@GMOFILES@,$GMOFILES," \
    po/Makefile.in > po/Makefile]],[[]])

dnl Required by html, pdf, install-pdf and install-html
AC_SUBST(datarootdir)
AC_SUBST(docdir)
AC_SUBST(htmldir)
AC_SUBST(pdfdir)

AC_CONFIG_FILES(Makefile po/Makefile.in:po/Make-in)
AC_OUTPUT

GNU_MAKE_JOBSERVER
