This is the mail archive of the binutils@sourceware.org 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]
Other format: [Raw text]

Add --force-dynamic flag to VxWorks targets


On VxWorks, the user is expected to explicitly say whether they want a
static or dynamic user-mode executable.  The flag used to select dynamic
executables is called --force-dynamic.

This patch adds a new VxWorks-specific emulation file, vxworks.em,
whose only use so far is to handle --force-dynamic.  The file is
supposed to be used on top of whatever .em file the architecture
normally uses (if any), so vxworks.sh remembers the original
EXTRA_EM_FILE setting in VXWORKS_BASE_EM_FILE, which vxworks.em
then includes.  The overrides in vxworks.em apply on top of any
from $VXWORKS_BASE_EM_FILE.

Tested on powerpc-vxworks and i586-vxworks.  OK to install?

Richard


ld/
	* 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.

diff -uprN ../src.1/ld/emulparams/vxworks.sh ./ld/emulparams/vxworks.sh
--- ./ld/emulparams/vxworks.sh	2006-03-02 15:23:16.000000000 +0000
+++ ./ld/emulparams/vxworks.sh	2006-03-02 10:09:38.000000000 +0000
@@ -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 -uprN ../src.1/ld/emultempl/vxworks.em ./ld/emultempl/vxworks.em
--- ./ld/emultempl/vxworks.em	1970-01-01 01:00:00.000000000 +0100
+++ ./ld/emultempl/vxworks.em	2006-03-02 15:53:57.000000000 +0000
@@ -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
diff -uprN ../src.1/ld/ld.texinfo ./ld/ld.texinfo
--- ./ld/ld.texinfo	2006-02-02 20:25:48.000000000 +0000
+++ ./ld/ld.texinfo	2006-03-02 16:06:16.000000000 +0000
@@ -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
diff -uprN ../src.1/ld/Makefile.am ./ld/Makefile.am
--- ./ld/Makefile.am	2006-03-02 15:23:16.000000000 +0000
+++ ./ld/Makefile.am	2006-03-02 10:09:38.000000000 +0000
@@ -768,7 +768,8 @@ eelf32ppcwindiss.c: $(srcdir)/emulparams
 	${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/e
   $(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 \
diff -uprN ../src.1/ld/Makefile.in ./ld/Makefile.in
--- ./ld/Makefile.in	2006-03-02 15:23:16.000000000 +0000
+++ ./ld/Makefile.in	2006-03-02 10:09:38.000000000 +0000
@@ -1574,7 +1574,8 @@ eelf32ppcwindiss.c: $(srcdir)/emulparams
 	${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/e
   $(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 \
diff -uprN ../src.1/ld/testsuite/ld-i386/i386.exp ./ld/testsuite/ld-i386/i386.exp
--- ./ld/testsuite/ld-i386/i386.exp	2006-03-02 15:23:16.000000000 +0000
+++ ./ld/testsuite/ld-i386/i386.exp	2006-03-02 15:32:16.000000000 +0000
@@ -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 -uprN ../src.1/ld/testsuite/ld-i386/vxworks1-static.d ./ld/testsuite/ld-i386/vxworks1-static.d
--- ./ld/testsuite/ld-i386/vxworks1-static.d	1970-01-01 01:00:00.000000000 +0100
+++ ./ld/testsuite/ld-i386/vxworks1-static.d	2006-03-02 15:04:55.000000000 +0000
@@ -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 -uprN ../src.1/ld/testsuite/ld-i386/vxworks2.s ./ld/testsuite/ld-i386/vxworks2.s
--- ./ld/testsuite/ld-i386/vxworks2.s	1970-01-01 01:00:00.000000000 +0100
+++ ./ld/testsuite/ld-i386/vxworks2.s	2006-03-02 14:49:25.000000000 +0000
@@ -0,0 +1,5 @@
+	.globl	_start
+	.type	_start,@function
+_start:
+	ret
+	.end	_start
diff -uprN ../src.1/ld/testsuite/ld-i386/vxworks2.sd ./ld/testsuite/ld-i386/vxworks2.sd
--- ./ld/testsuite/ld-i386/vxworks2.sd	1970-01-01 01:00:00.000000000 +0100
+++ ./ld/testsuite/ld-i386/vxworks2.sd	2006-03-02 14:56:04.000000000 +0000
@@ -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 .*
+
+#...
diff -uprN ../src.1/ld/testsuite/ld-i386/vxworks2-static.sd ./ld/testsuite/ld-i386/vxworks2-static.sd
--- ./ld/testsuite/ld-i386/vxworks2-static.sd	1970-01-01 01:00:00.000000000 +0100
+++ ./ld/testsuite/ld-i386/vxworks2-static.sd	2006-03-02 15:00:19.000000000 +0000
@@ -0,0 +1,9 @@
+#...
+Elf file type is EXEC \(Executable file\)
+Entry point 0x80000
+#...
+Program Headers:
+  Type .*
+  LOAD .* 0x00080000 0x00080000 .* R E 0x1000
+
+#...
diff -uprN ../src.1/ld/testsuite/ld-powerpc/powerpc.exp ./ld/testsuite/ld-powerpc/powerpc.exp
--- ./ld/testsuite/ld-powerpc/powerpc.exp	2006-03-02 15:23:16.000000000 +0000
+++ ./ld/testsuite/ld-powerpc/powerpc.exp	2006-03-02 15:32:23.000000000 +0000
@@ -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 -uprN ../src.1/ld/testsuite/ld-powerpc/vxworks1-static.d ./ld/testsuite/ld-powerpc/vxworks1-static.d
--- ./ld/testsuite/ld-powerpc/vxworks1-static.d	1970-01-01 01:00:00.000000000 +0100
+++ ./ld/testsuite/ld-powerpc/vxworks1-static.d	2006-03-02 15:03:36.000000000 +0000
@@ -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 -uprN ../src.1/ld/testsuite/ld-powerpc/vxworks2.s ./ld/testsuite/ld-powerpc/vxworks2.s
--- ./ld/testsuite/ld-powerpc/vxworks2.s	1970-01-01 01:00:00.000000000 +0100
+++ ./ld/testsuite/ld-powerpc/vxworks2.s	2006-03-02 10:30:52.000000000 +0000
@@ -0,0 +1,5 @@
+	.globl	_start
+	.type	_start,@function
+_start:
+	blr
+	.end	_start
diff -uprN ../src.1/ld/testsuite/ld-powerpc/vxworks2.sd ./ld/testsuite/ld-powerpc/vxworks2.sd
--- ./ld/testsuite/ld-powerpc/vxworks2.sd	1970-01-01 01:00:00.000000000 +0100
+++ ./ld/testsuite/ld-powerpc/vxworks2.sd	2006-03-02 14:55:57.000000000 +0000
@@ -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 .*
+
+#...
diff -uprN ../src.1/ld/testsuite/ld-powerpc/vxworks2-static.sd ./ld/testsuite/ld-powerpc/vxworks2-static.sd
--- ./ld/testsuite/ld-powerpc/vxworks2-static.sd	1970-01-01 01:00:00.000000000 +0100
+++ ./ld/testsuite/ld-powerpc/vxworks2-static.sd	2006-03-02 15:00:01.000000000 +0000
@@ -0,0 +1,9 @@
+#...
+Elf file type is EXEC \(Executable file\)
+Entry point 0x80000
+#...
+Program Headers:
+  Type .*
+  LOAD .* 0x00080000 0x00080000 .* R E 0x10000
+
+#...


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