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
 
 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.
 
 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.
 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)
 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.
 
 # 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)))
 
 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)))))
 
 endef
 
 $(foreach prog,$(PROGS),$(eval $(call TEMPLATE,$(prog),$(subst -,_,$(prog)))))
 
-$(PROGS): $(LIB)
-
 libc.a: $(LIB_OBJ)
        rm -f $@
        ar r $@ $^
 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
 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);
-  }
-}