Always use a custom linker script, to avoid oddities in the default.
authorBen Pfaff <blp@cs.stanford.edu>
Wed, 6 Apr 2005 18:47:14 +0000 (18:47 +0000)
committerBen Pfaff <blp@cs.stanford.edu>
Wed, 6 Apr 2005 18:47:14 +0000 (18:47 +0000)
Put linker scripts in lib/user.
Eliminate redundant dependency in Makefile.userprog.
Document change.

doc/vm.texi
src/Makefile.userprog
src/lib/user/fullpage.lds [new file with mode: 0644]
src/lib/user/normal.lds [new file with mode: 0644]
src/tests/userprog/Makefile
src/tests/userprog/fullpage.x [deleted file]

index 42bb3cea5c856d8ebb7955db5b3ee03fa754ac1b..99f4f4fb53fd3f05de770fc70670796e80de6e81 100644 (file)
@@ -460,7 +460,7 @@ such as Linux do not load partial pages lazily.
 
 Incidentally, if you have trouble handling the third case above, you
 can eliminate it temporarily by linking the test programs with a
-special ``linker script.''  Read @file{tests/userprog/Makefile} for
+special ``linker script.''  Read @file{Makefile.userprog} for
 details.  We will not test your submission with this special linker
 script, so the code you turn in must properly handle all cases.
 
index c5e6f3db33c6e992682c7b61818846b10b6a5034..2ecb8e737f9f6061506e84fc1e067e2ac685a021 100644 (file)
@@ -10,8 +10,12 @@ DEFINES = -DPINTOS -DUSER
 CPPFLAGS = -nostdinc -I$(SRCDIR) -I- -I$(SRCDIR)/lib -I$(SRCDIR)/lib/user -I.
 
 # Linker flags.
-LDFLAGS = -nostdlib -static
+LDFLAGS = -nostdlib -static -Wl,-T,$(LDSCRIPT)
 LDLIBS = $(shell $(CC) -print-libgcc-file-name)
+LDSCRIPT = $(SRCDIR)/lib/user/normal.lds
+# Uncomment the following line to round up section sizes
+# to full pages (for debugging only).
+#LDSCRIPT = $(SRCDIR)/lib/user/fullpage.lds
 
 # C library sources linked into every test program.
 LIB_SRC  = lib/debug.c                 # Debug code.
@@ -34,14 +38,12 @@ all: $(PROGS)
 
 define TEMPLATE
 $(2)_OBJ = $(patsubst %.c,%.o,$(patsubst %.S,%.o,$($(2)_SRC)))
-$(1): $$($(2)_OBJ) $$(LIB)
-       $$(CC) $$(LDFLAGS) $$^ $$(LDLIBS) -o $$@
+$(1): $$($(2)_OBJ) $$(LIB) $$(LDSCRIPT)
+       $$(CC) $$(LDFLAGS) $$($(2)_OBJ) $$(LIB) $$(LDLIBS) -o $$@
 endef
 
 $(foreach prog,$(PROGS),$(eval $(call TEMPLATE,$(prog),$(subst -,_,$(prog)))))
 
-$(PROGS): $(LIB)
-
 libc.a: $(LIB_OBJ)
        rm -f $@
        ar r $@ $^
diff --git a/src/lib/user/fullpage.lds b/src/lib/user/fullpage.lds
new file mode 100644 (file)
index 0000000..b438695
--- /dev/null
@@ -0,0 +1,50 @@
+OUTPUT_FORMAT("elf32-i386")
+OUTPUT_ARCH(i386)
+ENTRY(_start)
+
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  . = 0x08048000 + SIZEOF_HEADERS;
+  .text : { *(.text) . = ALIGN(0x1000); } = 0x90
+  .rodata : { *(.rodata) . = ALIGN(0x1000); }
+  .data : { *(.data) . = ALIGN(0x1000); }
+  .bss : { *(.bss) . = ALIGN(0x1000); }
+
+  /* Stabs debugging sections.  */
+  .stab          0 : { *(.stab) }
+  .stabstr       0 : { *(.stabstr) }
+  .stab.excl     0 : { *(.stab.excl) }
+  .stab.exclstr  0 : { *(.stab.exclstr) }
+  .stab.index    0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment       0 : { *(.comment) }
+
+  /* DWARF debug sections.
+  Symbols in the DWARF debugging sections are relative to the beginning
+  of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+  /DISCARD/ : { *(.note.GNU-stack) }
+  /DISCARD/ : { *(.eh_frame) }
+}
diff --git a/src/lib/user/normal.lds b/src/lib/user/normal.lds
new file mode 100644 (file)
index 0000000..e4ca5db
--- /dev/null
@@ -0,0 +1,56 @@
+OUTPUT_FORMAT("elf32-i386")
+OUTPUT_ARCH(i386)
+ENTRY(_start)
+
+SECTIONS
+{
+  /* Read-only sections, merged into text segment: */
+  . = 0x08048000 + SIZEOF_HEADERS;
+  .text : { *(.text) } = 0x90
+  .rodata : { *(.rodata) }
+
+  /* Adjust the address for the data segment.  We want to adjust up to
+     the same address within the page on the next page up.  */
+  . = ALIGN (0x1000) - ((0x1000 - .) & (0x1000 - 1)); 
+  . = DATA_SEGMENT_ALIGN (0x1000, 0x1000);
+
+  .data : { *(.data) }
+  .bss : { *(.bss) }
+
+  /* Stabs debugging sections.  */
+  .stab          0 : { *(.stab) }
+  .stabstr       0 : { *(.stabstr) }
+  .stab.excl     0 : { *(.stab.excl) }
+  .stab.exclstr  0 : { *(.stab.exclstr) }
+  .stab.index    0 : { *(.stab.index) }
+  .stab.indexstr 0 : { *(.stab.indexstr) }
+  .comment       0 : { *(.comment) }
+
+  /* DWARF debug sections.
+  Symbols in the DWARF debugging sections are relative to the beginning
+  of the section so we begin them at 0.  */
+  /* DWARF 1 */
+  .debug          0 : { *(.debug) }
+  .line           0 : { *(.line) }
+  /* GNU DWARF 1 extensions */
+  .debug_srcinfo  0 : { *(.debug_srcinfo) }
+  .debug_sfnames  0 : { *(.debug_sfnames) }
+  /* DWARF 1.1 and DWARF 2 */
+  .debug_aranges  0 : { *(.debug_aranges) }
+  .debug_pubnames 0 : { *(.debug_pubnames) }
+  /* DWARF 2 */
+  .debug_info     0 : { *(.debug_info .gnu.linkonce.wi.*) }
+  .debug_abbrev   0 : { *(.debug_abbrev) }
+  .debug_line     0 : { *(.debug_line) }
+  .debug_frame    0 : { *(.debug_frame) }
+  .debug_str      0 : { *(.debug_str) }
+  .debug_loc      0 : { *(.debug_loc) }
+  .debug_macinfo  0 : { *(.debug_macinfo) }
+  /* SGI/MIPS DWARF 2 extensions */
+  .debug_weaknames 0 : { *(.debug_weaknames) }
+  .debug_funcnames 0 : { *(.debug_funcnames) }
+  .debug_typenames 0 : { *(.debug_typenames) }
+  .debug_varnames  0 : { *(.debug_varnames) }
+  /DISCARD/ : { *(.note.GNU-stack) }
+  /DISCARD/ : { *(.eh_frame) }
+}
index 291cf75bbffb83a55a102f9689276c26c871ab23..2aad5a3e5f4f0d097ff8b1115dc020da7c15f615 100644 (file)
@@ -14,7 +14,3 @@ recursor_SRC = recursor.c
 shell_SRC = shell.c
 
 include $(SRCDIR)/Makefile.userprog
-
-# Uncomment the line below to round up segment sizes to full pages for
-# testing purposes only.
-#LDFLAGS += -Wl,-T,fullpage.x
diff --git a/src/tests/userprog/fullpage.x b/src/tests/userprog/fullpage.x
deleted file mode 100644 (file)
index 2fb94e1..0000000
+++ /dev/null
@@ -1,24 +0,0 @@
-/* Default linker script, for normal executables */
-OUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
-OUTPUT_ARCH(i386)
-ENTRY(_start)
-SECTIONS
-{
-  . = 0x08048000 + SIZEOF_HEADERS;
-  .text : { 
-    *(.text .text.*) 
-    . = ALIGN(0x1000);
-  } =0x90909090
-  .rodata : { 
-    *(.rodata .rodata.*) 
-    . = ALIGN(0x1000); 
-  }
-  .data : { 
-    *(.data .data.*) 
-    . = ALIGN(0x1000);
-  } 
-  .bss : { 
-    *(.bss .bss.*)
-    . = ALIGN(0x1000);
-  }
-}