diff options
Diffstat (limited to 'ld')
-rw-r--r-- | ld/ChangeLog | 8 | ||||
-rw-r--r-- | ld/emulparams/elf64alpha.sh | 85 |
2 files changed, 93 insertions, 0 deletions
diff --git a/ld/ChangeLog b/ld/ChangeLog index d082eb8..24557ca 100644 --- a/ld/ChangeLog +++ b/ld/ChangeLog @@ -1,3 +1,11 @@ +2000-07-27 Ivan Kokshaysky <ink@jurassic.park.msu.ru> + + * emulparams/elf64alpha.sh: Implement "-taso" emulation + specific option to fit 64-bit executable in the lower + 31-bit address range. This is done by changing start + address of .interp (the very first section of executable) + and then setting EF_ALPHA_32BIT elf header flag. + 2000-07-21 Michael Sokolov <msokolov@ivan.Harhan.ORG> * emultempl/m68kcoff.em: New file. diff --git a/ld/emulparams/elf64alpha.sh b/ld/emulparams/elf64alpha.sh index afa21f2..c3e4e52 100644 --- a/ld/emulparams/elf64alpha.sh +++ b/ld/emulparams/elf64alpha.sh @@ -13,3 +13,88 @@ DATA_PLT= NOP=0x47ff041f OTHER_READONLY_SECTIONS='.reginfo : { *(.reginfo) }' + +# This code gets inserted into the generic elf32.sc linker script +# and allows us to define our own command line switches. +PARSE_AND_LIST_ARGS=' +#define OPTION_TASO 300 +/* Set the start address as in the Tru64 ld */ +#define ALPHA_TEXT_START_32BIT 0x12000000 + +static int elf64alpha_32bit = 0; + +static struct option longopts[] = +{ + {"taso", no_argument, NULL, OPTION_TASO}, + {NULL, no_argument, NULL, 0} +}; + +static void +gld_elf64alpha_list_options (file) + FILE * file; +{ + fprintf (file, _( +" -taso Load executable in the lower 31-bit addressable + virtual address range.\n")); +} + +struct ld_emulation_xfer_struct ld_elf64alpha_emulation; +static void gld_elf64alpha_finish (); + +static int +gld_elf64alpha_parse_args (argc, argv) + int argc; + char ** argv; +{ + int longind; + int optc; + int prevoptind = optind; + int prevopterr = opterr; + int wanterror; + static int lastoptind = -1; + + if (lastoptind != optind) + opterr = 0; + + wanterror = opterr; + lastoptind = optind; + + optc = getopt_long_only (argc, argv, "-", longopts, & longind); + opterr = prevopterr; + + switch (optc) + { + default: + if (wanterror) + xexit (1); + optind = prevoptind; + return 0; + + case EOF: + if (elf64alpha_32bit && !link_info.shared && !link_info.relocateable) + { + lang_section_start (".interp", + exp_binop ('\''+'\'', + exp_intop (ALPHA_TEXT_START_32BIT), + exp_nameop (SIZEOF_HEADERS, NULL))); + ld_elf64alpha_emulation.finish = gld_elf64alpha_finish; + } + return 0; + + case OPTION_TASO: + elf64alpha_32bit = 1; + break; + } + + return 1; +} + +#include "elf/internal.h" +#include "elf/alpha.h" +#include "elf-bfd.h" + +static void +gld_elf64alpha_finish () +{ + elf_elfheader (output_bfd)->e_flags |= EF_ALPHA_32BIT; +}' |