This is the mail archive of the
binutils@sourceware.cygnus.com
mailing list for the binutils project.
[patch] GNU ld 32-bit addressing support for elf64alpha
- To: Richard Henderson <rth at cygnus dot com>
- Subject: [patch] GNU ld 32-bit addressing support for elf64alpha
- From: Ivan Kokshaysky <ink at jurassic dot park dot msu dot ru>
- Date: Mon, 29 Nov 1999 23:54:52 +0300
- Cc: binutils at sourceware dot cygnus dot com
This implements the "-taso" option, which has been present in the
OSF/DU/Tru64 ld for ages. It would save a lot of time while porting
some old applications storing pointers in ints.
Ivan.
*** binutils-2.9.5.0.16/ld/emulparams/elf64alpha.sh Thu Jun 3 22:02:10 1999
--- binutils/ld/emulparams/elf64alpha.sh Thu Nov 11 12:42:16 1999
***************
*** 13,15 ****
--- 13,99 ----
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;
+ }'