This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Add --force-dynamic flag to VxWorks targets
- From: Richard Sandiford <richard at codesourcery dot com>
- To: binutils at sourceware dot org
- Date: Thu, 02 Mar 2006 16:10:24 +0000
- Subject: 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
+
+#...