ld/
authorRichard Sandiford <rdsandiford@googlemail.com>
Fri, 3 Mar 2006 09:32:01 +0000 (09:32 +0000)
committerRichard Sandiford <rdsandiford@googlemail.com>
Fri, 3 Mar 2006 09:32:01 +0000 (09:32 +0000)
* emulparams/vxworks.sh (VXWORKS_BASE_EM_FILE): New variable.
(EXTRA_EM_FILE): Define.
* emultempl/vxworks.em: New file.
* ld.texinfo (--force-dynamic): Document.
* Makefile.am (eelf32ppcvxworks.cm, eelf_i386_vxworks.c): Depend
on vxworks.em.
* Makefile.in: Regenerate.

ld/testsuite/
* ld-i386/vxworks1-static.d, ld-i386/vxworks2.s,
* ld-i386/vxworks2.sd, ld-i386/vxworks2-static.sd: New tests.
* ld-i386/i386.exp: Run them.
* ld-powerpc/vxworks1-static.d, ld-powerpc/vxworks2.s,
* ld-powerpc/vxworks2.sd, ld-powerpc/vxworks2-static.sd: New tests.
* ld-powerpc/powerpc.exp: Run them.

17 files changed:
ld/ChangeLog
ld/Makefile.am
ld/Makefile.in
ld/emulparams/vxworks.sh
ld/emultempl/vxworks.em [new file with mode: 0644]
ld/ld.texinfo
ld/testsuite/ChangeLog
ld/testsuite/ld-i386/i386.exp
ld/testsuite/ld-i386/vxworks1-static.d [new file with mode: 0644]
ld/testsuite/ld-i386/vxworks2-static.sd [new file with mode: 0644]
ld/testsuite/ld-i386/vxworks2.s [new file with mode: 0644]
ld/testsuite/ld-i386/vxworks2.sd [new file with mode: 0644]
ld/testsuite/ld-powerpc/powerpc.exp
ld/testsuite/ld-powerpc/vxworks1-static.d [new file with mode: 0644]
ld/testsuite/ld-powerpc/vxworks2-static.sd [new file with mode: 0644]
ld/testsuite/ld-powerpc/vxworks2.s [new file with mode: 0644]
ld/testsuite/ld-powerpc/vxworks2.sd [new file with mode: 0644]

index 7568cd4..8ab52a4 100644 (file)
@@ -1,3 +1,13 @@
+2006-03-03  Richard Sandiford  <richard@codesourcery.com>
+
+       * emulparams/vxworks.sh (VXWORKS_BASE_EM_FILE): New variable.
+       (EXTRA_EM_FILE): Define.
+       * emultempl/vxworks.em: New file.
+       * ld.texinfo (--force-dynamic): Document.
+       * Makefile.am (eelf32ppcvxworks.cm, eelf_i386_vxworks.c): Depend
+       on vxworks.em.
+       * Makefile.in: Regenerate.
+
 2006-03-02  Richard Sandiford  <richard@codesourcery.com>
 
        * emulparams/elf32ppccommon.sh: New file, extracted from...
index 9554ab7..9679af0 100644 (file)
@@ -768,7 +768,8 @@ eelf32ppcwindiss.c: $(srcdir)/emulparams/elf32ppcwindiss.sh \
        ${GENSCRIPTS} elf32ppcwindiss "$(tdir_elf32ppcwindiss)"
 eelf32ppcvxworks.c: $(srcdir)/emulparams/elf32ppcvxworks.sh \
   $(srcdir)/emulparams/elf32ppccommon.sh $(srcdir)/emulparams/vxworks.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(srcdir)/emultempl/vxworks.em $(srcdir)/emultempl/elf32.em \
+  $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} elf32ppcvxworks "$(tdir_elf32ppcvxworks)"
 eelf32lsmip.c: $(srcdir)/emulparams/elf32lsmip.sh \
   $(srcdir)/emulparams/elf32lmip.sh $(srcdir)/emulparams/elf32bmip.sh \
@@ -901,7 +902,7 @@ eelf_i386_ldso.c: $(srcdir)/emulparams/elf_i386_ldso.sh \
   $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} elf_i386_ldso "$(tdir_elf_i386_ldso)"
 eelf_i386_vxworks.c: $(srcdir)/emulparams/elf_i386_vxworks.sh \
-  $(srcdir)/emulparams/vxworks.sh \
+  $(srcdir)/emulparams/vxworks.sh $(srcdir)/emultempl/vxworks.em \
   $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} elf_i386_vxworks "$(tdir_elf_i386_vxworks)"
 eelf_s390.c: $(srcdir)/emulparams/elf_s390.sh \
index a1a6f03..264f036 100644 (file)
@@ -1574,7 +1574,8 @@ eelf32ppcwindiss.c: $(srcdir)/emulparams/elf32ppcwindiss.sh \
        ${GENSCRIPTS} elf32ppcwindiss "$(tdir_elf32ppcwindiss)"
 eelf32ppcvxworks.c: $(srcdir)/emulparams/elf32ppcvxworks.sh \
   $(srcdir)/emulparams/elf32ppccommon.sh $(srcdir)/emulparams/vxworks.sh \
-  $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
+  $(srcdir)/emultempl/vxworks.em $(srcdir)/emultempl/elf32.em \
+  $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} elf32ppcvxworks "$(tdir_elf32ppcvxworks)"
 eelf32lsmip.c: $(srcdir)/emulparams/elf32lsmip.sh \
   $(srcdir)/emulparams/elf32lmip.sh $(srcdir)/emulparams/elf32bmip.sh \
@@ -1707,7 +1708,7 @@ eelf_i386_ldso.c: $(srcdir)/emulparams/elf_i386_ldso.sh \
   $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} elf_i386_ldso "$(tdir_elf_i386_ldso)"
 eelf_i386_vxworks.c: $(srcdir)/emulparams/elf_i386_vxworks.sh \
-  $(srcdir)/emulparams/vxworks.sh \
+  $(srcdir)/emulparams/vxworks.sh $(srcdir)/emultempl/vxworks.em \
   $(srcdir)/emultempl/elf32.em $(srcdir)/scripttempl/elf.sc ${GEN_DEPENDS}
        ${GENSCRIPTS} elf_i386_vxworks "$(tdir_elf_i386_vxworks)"
 eelf_s390.c: $(srcdir)/emulparams/elf_s390.sh \
index 0bd00e5..e626732 100644 (file)
@@ -23,3 +23,5 @@ FINI_END='KEEP (*(.fini$99));
 ETEXT_NAME=etext_unrelocated
 OTHER_SYMBOLS="PROVIDE (_ehdr = ${TEXT_START_ADDR});"
 DATA_END_SYMBOLS=".edata : { PROVIDE (_edata = .); }"
+VXWORKS_BASE_EM_FILE=$EXTRA_EM_FILE
+EXTRA_EM_FILE=vxworks
diff --git a/ld/emultempl/vxworks.em b/ld/emultempl/vxworks.em
new file mode 100644 (file)
index 0000000..eafbb58
--- /dev/null
@@ -0,0 +1,49 @@
+if test -n "$VXWORKS_BASE_EM_FILE" ; then
+. "${srcdir}/emultempl/${VXWORKS_BASE_EM_FILE}.em"
+fi
+
+cat >>e${EMULATION_NAME}.c <<EOF
+
+static int force_dynamic;
+
+static void
+vxworks_after_open (void)
+{
+  ${LDEMUL_AFTER_OPEN-gld${EMULATION_NAME}_after_open} ();
+
+  if (force_dynamic
+      && link_info.input_bfds
+      && !_bfd_elf_link_create_dynamic_sections (link_info.input_bfds,
+                                                &link_info))
+    einfo ("%X%P: Cannot create dynamic sections %E\n");
+
+  if (!force_dynamic
+      && !link_info.shared
+      && elf_hash_table (&link_info)->dynamic_sections_created)
+    einfo ("%X%P: Dynamic sections created in non-dynamic link\n");
+}
+
+EOF
+
+PARSE_AND_LIST_PROLOGUE=$PARSE_AND_LIST_PROLOGUE'
+enum {
+  OPTION_FORCE_DYNAMIC = 501
+};
+'
+
+PARSE_AND_LIST_LONGOPTS=$PARSE_AND_LIST_LONGOPTS'
+  {"force-dynamic", no_argument, NULL, OPTION_FORCE_DYNAMIC},
+'
+
+PARSE_AND_LIST_OPTIONS=$PARSE_AND_LIST_OPTIONS'
+  fprintf (file, _("\
+  --force-dynamic       Always create dynamic sections\n"));
+'
+
+PARSE_AND_LIST_ARGS_CASES=$PARSE_AND_LIST_ARGS_CASES'
+    case OPTION_FORCE_DYNAMIC:
+      force_dynamic = 1;
+      break;
+'
+
+LDEMUL_AFTER_OPEN=vxworks_after_open
index d455727..1e3b3e8 100644 (file)
@@ -772,6 +772,12 @@ in larger executables.
 
 This option is currently only supported on ELF platforms.
 
+@kindex --force-dynamic
+@cindex forcing the creation of dynamic sections
+@item --force-dynamic
+Force the output file to have dynamic sections.  This option is specific
+to VxWorks targets.
+
 @cindex partial link
 @cindex relocatable output
 @kindex -r
index 1e5b950..a8e2d96 100644 (file)
@@ -1,3 +1,12 @@
+2006-03-03  Richard Sandiford  <richard@codesourcery.com>
+
+       * ld-i386/vxworks1-static.d, ld-i386/vxworks2.s,
+       * ld-i386/vxworks2.sd, ld-i386/vxworks2-static.sd: New tests.
+       * ld-i386/i386.exp: Run them.
+       * ld-powerpc/vxworks1-static.d, ld-powerpc/vxworks2.s,
+       * ld-powerpc/vxworks2.sd, ld-powerpc/vxworks2-static.sd: New tests.
+       * ld-powerpc/powerpc.exp: Run them.
+
 2006-03-02  Richard Sandiford  <richard@codesourcery.com>
 
        * ld-powerpc/vxworks1.ld: Use a page alignment of 0x10000.
index b0195ca..ad8a610 100644 (file)
@@ -26,12 +26,24 @@ if {[istarget "i?86-*-vxworks"]} {
         {{readelf --relocs vxworks1-lib.rd} {objdump -dr vxworks1-lib.dd}
          {readelf --symbols vxworks1-lib.nd}}
         "libvxworks1.so"}
-       {"VxWorks dynamic executable test 1" \
-        "tmpdir/libvxworks1.so -Tvxworks1.ld -q" "" {vxworks1.s}
+       {"VxWorks executable test 1 (dynamic)" \
+        "tmpdir/libvxworks1.so -Tvxworks1.ld -q --force-dynamic"
+        "" {vxworks1.s}
         {{readelf --relocs vxworks1.rd} {objdump -dr vxworks1.dd}}
         "vxworks1"}
+       {"VxWorks executable test 2 (dynamic)" \
+        "-Tvxworks1.ld -q --force-dynamic"
+        "" {vxworks2.s}
+        {{readelf --segments vxworks2.sd}}
+        "vxworks2"}
+       {"VxWorks executable test 2 (static)"
+        "-Tvxworks1.ld"
+        "" {vxworks2.s}
+        {{readelf --segments vxworks2-static.sd}}
+        "vxworks2"}
     }
     run_ld_link_tests $i386tests
+    run_dump_test "vxworks1-static"
 }
 
 if { !([istarget "i?86-*-elf*"]                
diff --git a/ld/testsuite/ld-i386/vxworks1-static.d b/ld/testsuite/ld-i386/vxworks1-static.d
new file mode 100644 (file)
index 0000000..88c0baf
--- /dev/null
@@ -0,0 +1,4 @@
+#name: VxWorks executable test 1 (static)
+#source: vxworks1.s
+#ld: tmpdir/libvxworks1.so -Tvxworks1.ld
+#error: Dynamic sections created in non-dynamic link
diff --git a/ld/testsuite/ld-i386/vxworks2-static.sd b/ld/testsuite/ld-i386/vxworks2-static.sd
new file mode 100644 (file)
index 0000000..912755b
--- /dev/null
@@ -0,0 +1,9 @@
+#...
+Elf file type is EXEC \(Executable file\)
+Entry point 0x80000
+#...
+Program Headers:
+  Type .*
+  LOAD .* 0x00080000 0x00080000 .* R E 0x1000
+
+#...
diff --git a/ld/testsuite/ld-i386/vxworks2.s b/ld/testsuite/ld-i386/vxworks2.s
new file mode 100644 (file)
index 0000000..28c8acb
--- /dev/null
@@ -0,0 +1,5 @@
+       .globl  _start
+       .type   _start,@function
+_start:
+       ret
+       .end    _start
diff --git a/ld/testsuite/ld-i386/vxworks2.sd b/ld/testsuite/ld-i386/vxworks2.sd
new file mode 100644 (file)
index 0000000..5ff87d3
--- /dev/null
@@ -0,0 +1,13 @@
+#...
+Elf file type is EXEC \(Executable file\)
+Entry point 0x80400
+#...
+Program Headers:
+  Type .*
+  PHDR .*
+#...
+  LOAD .* 0x00080000 0x00080000 .* R E 0x1000
+  LOAD .* 0x00081000 0x00081000 .* RW  0x1000
+  DYNAMIC .*
+
+#...
index db7fe59..681bb6e 100644 (file)
@@ -31,12 +31,24 @@ if {[istarget "*-*-vxworks"]} {
         {{readelf --relocs vxworks1-lib.rd} {objdump -dr vxworks1-lib.dd}
          {readelf --symbols vxworks1-lib.nd}}
         "libvxworks1.so"}
-       {"VxWorks dynamic executable test 1" \
-        "tmpdir/libvxworks1.so -Tvxworks1.ld -q" "-mregnames" {vxworks1.s}
+       {"VxWorks executable test 1 (dynamic)" \
+        "tmpdir/libvxworks1.so -Tvxworks1.ld -q --force-dynamic"
+        "-mregnames" {vxworks1.s}
         {{readelf --relocs vxworks1.rd} {objdump -dr vxworks1.dd}}
         "vxworks1"}
+       {"VxWorks executable test 2 (dynamic)" \
+        "-Tvxworks1.ld -q --force-dynamic"
+        "-mregnames" {vxworks2.s}
+        {{readelf --segments vxworks2.sd}}
+        "vxworks2"}
+       {"VxWorks executable test 2 (static)"
+        "-Tvxworks1.ld"
+        "-mregnames" {vxworks2.s}
+        {{readelf --segments vxworks2-static.sd}}
+        "vxworks2"}
     }
     run_ld_link_tests $ppcvxtests
+    run_dump_test "vxworks1-static"
     return
 }
 
diff --git a/ld/testsuite/ld-powerpc/vxworks1-static.d b/ld/testsuite/ld-powerpc/vxworks1-static.d
new file mode 100644 (file)
index 0000000..4c2d1fd
--- /dev/null
@@ -0,0 +1,4 @@
+#name: VxWorks executable test 1 (static)
+#source: vxworks1.s -mregnames
+#ld: tmpdir/libvxworks1.so -Tvxworks1.ld
+#error: Dynamic sections created in non-dynamic link
diff --git a/ld/testsuite/ld-powerpc/vxworks2-static.sd b/ld/testsuite/ld-powerpc/vxworks2-static.sd
new file mode 100644 (file)
index 0000000..55fc529
--- /dev/null
@@ -0,0 +1,9 @@
+#...
+Elf file type is EXEC \(Executable file\)
+Entry point 0x80000
+#...
+Program Headers:
+  Type .*
+  LOAD .* 0x00080000 0x00080000 .* R E 0x10000
+
+#...
diff --git a/ld/testsuite/ld-powerpc/vxworks2.s b/ld/testsuite/ld-powerpc/vxworks2.s
new file mode 100644 (file)
index 0000000..5e8d73a
--- /dev/null
@@ -0,0 +1,5 @@
+       .globl  _start
+       .type   _start,@function
+_start:
+       blr
+       .end    _start
diff --git a/ld/testsuite/ld-powerpc/vxworks2.sd b/ld/testsuite/ld-powerpc/vxworks2.sd
new file mode 100644 (file)
index 0000000..0876568
--- /dev/null
@@ -0,0 +1,13 @@
+#...
+Elf file type is EXEC \(Executable file\)
+Entry point 0x80400
+#...
+Program Headers:
+  Type .*
+  PHDR .*
+#...
+  LOAD .* 0x00080000 0x00080000 .* R E 0x10000
+  LOAD .* 0x00090000 0x00090000 .* RW  0x10000
+  DYNAMIC .*
+
+#...