about summary refs log tree commit diff
path: root/src/boot
diff options
context:
space:
mode:
authorGraydon Hoare <graydon@mozilla.com>2011-02-09 11:30:50 -0800
committerGraydon Hoare <graydon@mozilla.com>2011-02-09 11:37:55 -0800
commit60635999f313981abe157318025a19d60d8d310a (patch)
tree898411ca702341f612d493e03f474b43d7ce4e4d /src/boot
parenta1cc5ac63c7d2b7da595cbc31253389a991824bd (diff)
Add .bss fragment support to elf.
Diffstat (limited to 'src/boot')
-rw-r--r--src/boot/be/elf.ml34
1 files changed, 31 insertions, 3 deletions
diff --git a/src/boot/be/elf.ml b/src/boot/be/elf.ml
index a1706082f5a..f17541eeff0 100644
--- a/src/boot/be/elf.ml
+++ b/src/boot/be/elf.ml
@@ -488,6 +488,7 @@ let elf32_linux_x86_file
     ~(entry_name:string)
     ~(text_frags:(string option, frag) Hashtbl.t)
     ~(data_frags:(string option, frag) Hashtbl.t)
+    ~(bss_frags:(string option, frag) Hashtbl.t)
     ~(rodata_frags:(string option, frag) Hashtbl.t)
     ~(required_fixups:(string, fixup) Hashtbl.t)
     ~(dwarf:Dwarf.debug_records)
@@ -652,7 +653,7 @@ let elf32_linux_x86_file
   (* let gotpltndx      = 8L in *)  (* Section index of .got.plt *)
   (* let relapltndx     = 9L in *)  (* Section index of .rela.plt *)
   let datandx        = 10L in  (* Section index of .data *)
-  (* let bssndx         = 11L in *) (* Section index of .bss *)
+  let bssndx         = 11L in  (* Section index of .bss *)
   (* let dynamicndx     = 12L in *) (* Section index of .dynamic *)
   let shstrtabndx    = 13L in (* Section index of .shstrtab *)
 
@@ -999,6 +1000,22 @@ let elf32_linux_x86_file
       (strtab_entry, symtab_entry)
   in
 
+  let bss_sym name st_bind fixup =
+    let name_fixup = new_fixup ("bss symbol name fixup: '" ^ name ^ "'") in
+    let strtab_entry = DEF (name_fixup, ZSTRING name) in
+    let symtab_entry =
+      symbol
+        ~string_table_fixup: dynstr_section_fixup
+        ~name_string_fixup: name_fixup
+        ~sym_target_fixup: (Some fixup)
+        ~st_bind
+        ~st_type: STT_OBJECT
+        ~st_shndx: bssndx
+    in
+      incr n_syms;
+      (strtab_entry, symtab_entry)
+  in
+
   let rodata_sym name st_bind fixup =
     let name_fixup = new_fixup ("rodata symbol name fixup: '" ^ name ^ "'") in
     let strtab_entry = DEF (name_fixup, ZSTRING name) in
@@ -1220,6 +1237,12 @@ let elf32_linux_x86_file
     Hashtbl.fold (frags_of_symbol data_sym STB_GLOBAL) data_frags ([],[],[])
   in
 
+  let (bss_strtab_frags,
+       bss_symtab_frags,
+       bss_body_frags) =
+    Hashtbl.fold (frags_of_symbol bss_sym STB_GLOBAL) bss_frags ([],[],[])
+  in
+
   let (_,
        require_strtab_frags,
        require_symtab_frags,
@@ -1285,7 +1308,8 @@ let elf32_linux_x86_file
                            global_text_symtab_frags @
                            local_text_symtab_frags @
                            rodata_symtab_frags @
-                           data_symtab_frags))
+                           data_symtab_frags @
+                           bss_symtab_frags))
   in
 
   let dynstr_frags = (null_strtab_frag ::
@@ -1294,6 +1318,7 @@ let elf32_linux_x86_file
                            local_text_strtab_frags @
                            rodata_strtab_frags @
                            data_strtab_frags @
+                           bss_strtab_frags @
                            (Array.to_list dynamic_needed_strtab_frags)))
   in
 
@@ -1319,7 +1344,7 @@ let elf32_linux_x86_file
   in
   let bss_section =
     DEF (bss_section_fixup,
-         SEQ [| |])
+         SEQ (Array.of_list bss_body_frags))
   in
   let dynsym_section =
     DEF (dynsym_section_fixup,
@@ -1498,6 +1523,7 @@ let emit_file
   let text_frags = Hashtbl.create 4 in
   let rodata_frags = Hashtbl.create 4 in
   let data_frags = Hashtbl.create 4 in
+  let bss_frags = Hashtbl.create 4 in
   let required_fixups = Hashtbl.create 4 in
 
   (*
@@ -1630,6 +1656,7 @@ let emit_file
       end
       sem.Semant.ctxt_native_required
   in
+
   let all_frags =
     elf32_linux_x86_file
       ~sess
@@ -1637,6 +1664,7 @@ let emit_file
       ~entry_name: "_start"
       ~text_frags
       ~data_frags
+      ~bss_frags
       ~dwarf
       ~sem
       ~rodata_frags