This is the mail archive of the binutils@sourceware.cygnus.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[patch] GNU ld 32-bit addressing support for elf64alpha


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;
+ }'

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]