diff options
-rw-r--r-- | ld/ChangeLog | 14 | ||||
-rw-r--r-- | ld/emultempl/elf32.em | 13 | ||||
-rw-r--r-- | ld/ldmain.c | 1 | ||||
-rw-r--r-- | ld/lexsup.c | 7 |
4 files changed, 33 insertions, 2 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index 28be7bc..928908b 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,5 +1,19 @@ 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. diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em index 1ce59dd..7585f41 100644 --- a/ld/emultempl/elf32.em +++ b/ld/emultempl/elf32.em @@ -59,6 +59,8 @@ gld${EMULATION_NAME}_before_parse() 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. */ @@ -66,8 +68,17 @@ gld${EMULATION_NAME}_before_allocation () /* 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 diff --git a/ld/ldmain.c b/ld/ldmain.c index bfe74f0..82b5a40 100644 --- a/ld/ldmain.c +++ b/ld/ldmain.c @@ -162,6 +162,7 @@ main (argc, argv) 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; diff --git a/ld/lexsup.c b/ld/lexsup.c index 668ec25..0b52a11 100644 --- a/ld/lexsup.c +++ b/ld/lexsup.c @@ -57,7 +57,8 @@ parse_args (argc, argv) #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) @@ -85,6 +86,7 @@ parse_args (argc, argv) {"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'}, @@ -160,6 +162,9 @@ parse_args (argc, argv) 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 |