* ld.h (args_type): Add new field interpreter.
* lexsup.c (parse_args): Add dynamic-linker to longopts, and
handle it.
* ldmain.c (main): Initialize command_line.interpreter to NULL.
* emultempl/elf32.em (gld${EMULATION_NAME}_before_allocation): Get
the ELF backend to return the .interp section. If
command_line.interpreter is not NULL, set the contents of .interp
to it.
* ld.texinfo: Mention -dynamic-linker.
Wed Jun 15 01:54:54 1994 Ian Lance Taylor (ian@tweedledumb.cygnus.com)
+ Let the user change the dynamic linker used by ELF code.
+ * ld.h (args_type): Add new field interpreter.
+ * lexsup.c (parse_args): Add dynamic-linker to longopts, and
+ handle it.
+ * ldmain.c (main): Initialize command_line.interpreter to NULL.
+ * emultempl/elf32.em (gld${EMULATION_NAME}_before_allocation): Get
+ the ELF backend to return the .interp section. If
+ command_line.interpreter is not NULL, set the contents of .interp
+ to it.
+ * ld.texinfo: Mention -dynamic-linker.
+
+ * config/sun4sol2.mt (eelf32_sparc.c): Depend upon elf32.em, not
+ generic.em.
+
* lexsup.c (parse_args): Sort out the option macros and change the
definitions to make it easier to add a new option.
static void
gld${EMULATION_NAME}_before_allocation ()
{
+ asection *sinterp;
+
/* If we are going to make any variable assignments, we need to let
the ELF backend know about them in case the variables are
referred to by dynamic objects. */
/* Let the ELF backend work out the sizes of any sections required
by dynamic linking. */
- if (! bfd_elf32_size_dynamic_sections (output_bfd, &link_info))
+ if (! bfd_elf32_size_dynamic_sections (output_bfd, &link_info,
+ &sinterp))
einfo ("%P%F: failed to set dynamic section sizes: %E\n");
+
+ /* Let the user override the dynamic linker we are using. */
+ if (command_line.interpreter != NULL
+ && sinterp != NULL)
+ {
+ sinterp->contents = (bfd_byte *) command_line.interpreter;
+ sinterp->_raw_size = strlen (command_line.interpreter) + 1;
+ }
}
/* This is called by the before_allocation routine via
config.build_constructors = true;
config.dynamic_link = false;
command_line.force_common_definition = false;
+ command_line.interpreter = NULL;
link_info.callbacks = &link_callbacks;
link_info.relocateable = false;
#define OPTION_CALL_SHARED 150
#define OPTION_DEFSYM (OPTION_CALL_SHARED + 1)
-#define OPTION_EB (OPTION_DEFSYM + 1)
+#define OPTION_DYNAMIC_LINKER (OPTION_DEFSYM + 1)
+#define OPTION_EB (OPTION_DYNAMIC_LINKER + 1)
#define OPTION_EL (OPTION_EB + 1)
#define OPTION_HELP (OPTION_EL + 1)
#define OPTION_IGNORE (OPTION_HELP + 1)
{"dn", no_argument, NULL, OPTION_NON_SHARED},
{"dp", no_argument, NULL, 'd'},
{"dy", no_argument, NULL, OPTION_CALL_SHARED},
+ {"dynamic-linker", required_argument, NULL, OPTION_DYNAMIC_LINKER},
{"EB", no_argument, NULL, OPTION_EB},
{"EL", no_argument, NULL, OPTION_EL},
{"format", required_argument, NULL, 'b'},
parser_input = input_defsym;
yyparse ();
break;
+ case OPTION_DYNAMIC_LINKER:
+ command_line.interpreter = optarg;
+ break;
case OPTION_EB:
/* FIXME: This is currently ignored. It means
``produce a big-endian object file''. It could