2010-05-13 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Thu, 13 May 2010 20:18:40 +0000 (20:18 -0000)
committerZoltan Varga <vargaz@gmail.com>
Thu, 13 May 2010 20:18:40 +0000 (20:18 -0000)
* aot-compiler.c: Put non-code data into the .rodata section on linux.

svn path=/trunk/mono/; revision=157318

mono/mini/ChangeLog
mono/mini/aot-compiler.c
mono/mini/image-writer.c

index cde052f962cb2920b8a9b85d711aae486a0c50e7..490a2f936449404e76d234a820a1bbbfafaecad7 100755 (executable)
@@ -1,6 +1,10 @@
 2010-05-13  Zoltan Varga  <vargaz@gmail.com>
 
-       (mono_arch_handle_exception): Fix the cross-compile case.
+       * aot-compiler.c: Put non-code data into the .rodata section on linux.
+
+2010-05-13  Zoltan Varga  <vargaz@gmail.com>
+
+       * exceptions-arm.c (mono_arch_handle_exception): Fix the cross-compile case.
 
 2010-05-13  Zoltan Varga  <vargaz@gmail.com>
 
index 1fdb3a19e42a0f6e69e5562af90ba65a6a2026d6..98531a16f8f05214ec5b4a9f967a3e0af3206667 100644 (file)
 
 #if !defined(DISABLE_AOT) && !defined(DISABLE_JIT)
 
+#if defined(__linux__)
+#define RODATA_SECT ".rodata"
+#else
+#define RODATA_SECT ".text"
+#endif
+
 #define TV_DECLARE(name) gint64 name
 #define TV_GETTIME(tv) tv = mono_100ns_ticks ()
 #define TV_ELAPSED(start,end) (((end) - (start)) / 10)
@@ -344,7 +350,7 @@ emit_symbol_size (MonoAotCompile *acfg, const char *name, const char *end_label)
 static void
 emit_string_symbol (MonoAotCompile *acfg, const char *name, const char *value)
 {
-       img_writer_emit_section_change (acfg->w, ".text", 1);
+       img_writer_emit_section_change (acfg->w, RODATA_SECT, 1);
        emit_global (acfg, name, FALSE);
        img_writer_emit_label (acfg->w, name);
        img_writer_emit_string (acfg->w, value);
@@ -3746,7 +3752,7 @@ emit_trampoline (MonoAotCompile *acfg, int got_offset, MonoTrampInfo *info)
 
        info_offset = add_to_blob (acfg, buf, p - buf);
 
-       emit_section_change (acfg, ".text", 0);
+       emit_section_change (acfg, RODATA_SECT, 0);
        emit_global (acfg, symbol, FALSE);
        emit_label (acfg, symbol);
 
@@ -4728,7 +4734,7 @@ emit_code (MonoAotCompile *acfg)
        emit_label (acfg, symbol);
 
        sprintf (symbol, "code_offsets");
-       emit_section_change (acfg, ".text", 1);
+       emit_section_change (acfg, RODATA_SECT, 1);
        emit_global (acfg, symbol, FALSE);
        emit_alignment (acfg, 8);
        emit_label (acfg, symbol);
@@ -4768,7 +4774,7 @@ emit_info (MonoAotCompile *acfg)
        }
 
        sprintf (symbol, "method_info_offsets");
-       emit_section_change (acfg, ".text", 1);
+       emit_section_change (acfg, RODATA_SECT, 1);
        emit_global (acfg, symbol, FALSE);
        emit_alignment (acfg, 8);
        emit_label (acfg, symbol);
@@ -5108,7 +5114,7 @@ emit_extra_methods (MonoAotCompile *acfg)
 
        /* Emit the table */
        sprintf (symbol, "extra_method_table");
-       emit_section_change (acfg, ".text", 0);
+       emit_section_change (acfg, RODATA_SECT, 0);
        emit_global (acfg, symbol, FALSE);
        emit_alignment (acfg, 8);
        emit_label (acfg, symbol);
@@ -5137,7 +5143,7 @@ emit_extra_methods (MonoAotCompile *acfg)
         * This is used by mono_aot_find_jit_info ().
         */
        sprintf (symbol, "extra_method_info_offsets");
-       emit_section_change (acfg, ".text", 0);
+       emit_section_change (acfg, RODATA_SECT, 0);
        emit_global (acfg, symbol, FALSE);
        emit_alignment (acfg, 8);
        emit_label (acfg, symbol);
@@ -5169,7 +5175,7 @@ emit_exception_info (MonoAotCompile *acfg)
        }
 
        sprintf (symbol, "ex_info_offsets");
-       emit_section_change (acfg, ".text", 1);
+       emit_section_change (acfg, RODATA_SECT, 1);
        emit_global (acfg, symbol, FALSE);
        emit_alignment (acfg, 8);
        emit_label (acfg, symbol);
@@ -5191,7 +5197,7 @@ emit_unwind_info (MonoAotCompile *acfg)
         */
 
        sprintf (symbol, "unwind_info");
-       emit_section_change (acfg, ".text", 1);
+       emit_section_change (acfg, RODATA_SECT, 1);
        emit_alignment (acfg, 8);
        emit_label (acfg, symbol);
        emit_global (acfg, symbol, FALSE);
@@ -5226,7 +5232,7 @@ emit_class_info (MonoAotCompile *acfg)
                offsets [i] = emit_klass_info (acfg, MONO_TOKEN_TYPE_DEF | (i + 1));
 
        sprintf (symbol, "class_info_offsets");
-       emit_section_change (acfg, ".text", 1);
+       emit_section_change (acfg, RODATA_SECT, 1);
        emit_global (acfg, symbol, FALSE);
        emit_alignment (acfg, 8);
        emit_label (acfg, symbol);
@@ -5285,7 +5291,7 @@ emit_class_name_table (MonoAotCompile *acfg)
 
        /* Emit the table */
        sprintf (symbol, "class_name_table");
-       emit_section_change (acfg, ".text", 0);
+       emit_section_change (acfg, RODATA_SECT, 0);
        emit_global (acfg, symbol, FALSE);
        emit_alignment (acfg, 8);
        emit_label (acfg, symbol);
@@ -5322,7 +5328,7 @@ emit_image_table (MonoAotCompile *acfg)
         */
 
        sprintf (symbol, "mono_image_table");
-       emit_section_change (acfg, ".text", 1);
+       emit_section_change (acfg, RODATA_SECT, 1);
        emit_global (acfg, symbol, FALSE);
        emit_alignment (acfg, 8);
        emit_label (acfg, symbol);
@@ -5405,7 +5411,7 @@ emit_got_info (MonoAotCompile *acfg)
 
        /* Emit got_info_offsets table */
        sprintf (symbol, "got_info_offsets");
-       emit_section_change (acfg, ".text", 1);
+       emit_section_change (acfg, RODATA_SECT, 1);
        emit_global (acfg, symbol, FALSE);
        emit_alignment (acfg, 8);
        emit_label (acfg, symbol);
@@ -5488,7 +5494,7 @@ emit_globals_table (MonoAotCompile *acfg)
 
        /* Emit the table */
        sprintf (symbol, ".Lglobals_hash");
-       emit_section_change (acfg, ".text", 0);
+       emit_section_change (acfg, RODATA_SECT, 0);
        emit_alignment (acfg, 8);
        emit_label (acfg, symbol);
 
@@ -5515,7 +5521,7 @@ emit_globals_table (MonoAotCompile *acfg)
                char *name = g_ptr_array_index (acfg->globals, i);
 
                sprintf (symbol, "name_%d", i);
-               emit_section_change (acfg, ".text", 1);
+               emit_section_change (acfg, RODATA_SECT, 1);
                emit_label (acfg, symbol);
                emit_string (acfg, name);
        }
@@ -5666,7 +5672,7 @@ emit_blob (MonoAotCompile *acfg)
        char symbol [128];
 
        sprintf (symbol, "blob");
-       emit_section_change (acfg, ".text", 1);
+       emit_section_change (acfg, RODATA_SECT, 1);
        emit_global (acfg, symbol, FALSE);
        emit_alignment (acfg, 8);
        emit_label (acfg, symbol);
index 1fcc8735689f5842a34cf3900847824f26bae63a..c5fecf91053629f70180d51dd555b9d0baf0e3ee 100644 (file)
@@ -470,6 +470,7 @@ enum {
        SECT_TEXT,
        SECT_DYNAMIC,
        SECT_GOT_PLT,
+       SECT_RODATA,
        SECT_DATA,
        SECT_BSS,
        SECT_DEBUG_FRAME,
@@ -523,6 +524,7 @@ static SectInfo section_info [] = {
        {".text", SHT_PROGBITS, 0, 6, 4096},
        {".dynamic", SHT_DYNAMIC, sizeof (ElfDynamic), 3, SIZEOF_VOID_P},
        {".got.plt", SHT_PROGBITS, SIZEOF_VOID_P, 3, SIZEOF_VOID_P},
+       {".rodata", SHT_PROGBITS, 0, 6, 4096},
        {".data", SHT_PROGBITS, 0, 3, 8},
        {".bss", SHT_NOBITS, 0, 3, 8},
        {".debug_frame", SHT_PROGBITS, 0, 0, 8},
@@ -716,6 +718,11 @@ collect_syms (MonoImageWriter *acfg, int *hash, ElfStrTable *strtab, ElfSectHead
                                section->shidx = SECT_TEXT;
                                section->file_offset = 4096;
                                symbols [i].st_value = section->virt_offset;
+                       } else if (strcmp (section->name, ".rodata") == 0) {
+                               symbols [i].st_shndx = SECT_RODATA;
+                               section->shidx = SECT_RODATA;
+                               section->file_offset = 4096;
+                               symbols [i].st_value = section->virt_offset;
                        } else if (strcmp (section->name, ".data") == 0) {
                                symbols [i].st_shndx = SECT_DATA;
                                section->shidx = SECT_DATA;
@@ -1033,7 +1040,7 @@ bin_writer_fseek (MonoImageWriter *acfg, int offset)
                acfg->out_buf_pos = offset;
 }
 
-static int normal_sections [] = { SECT_DATA, SECT_DEBUG_FRAME, SECT_DEBUG_INFO, SECT_DEBUG_ABBREV, SECT_DEBUG_LINE, SECT_DEBUG_LOC };
+static int normal_sections [] = { SECT_RODATA, SECT_DATA, SECT_DEBUG_FRAME, SECT_DEBUG_INFO, SECT_DEBUG_ABBREV, SECT_DEBUG_LINE, SECT_DEBUG_LOC };
 
 static int
 bin_writer_emit_writeout (MonoImageWriter *acfg)
@@ -1180,6 +1187,17 @@ bin_writer_emit_writeout (MonoImageWriter *acfg)
        file_offset += size;
        virt_offset += size;
 
+       file_offset = ALIGN_TO (file_offset, secth [SECT_RODATA].sh_addralign);
+       virt_offset = ALIGN_TO (virt_offset, secth [SECT_RODATA].sh_addralign);
+       secth [SECT_RODATA].sh_addr = virt_offset;
+       secth [SECT_RODATA].sh_offset = file_offset;
+       if (sections [SECT_RODATA]) {
+               size = sections [SECT_RODATA]->cur_offset;
+               secth [SECT_RODATA].sh_size = size;
+               file_offset += size;
+               virt_offset += size;
+       }
+
        file_offset = ALIGN_TO (file_offset, secth [SECT_DATA].sh_addralign);
        virt_offset = ALIGN_TO (virt_offset, secth [SECT_DATA].sh_addralign);
        secth [SECT_DATA].sh_addr = virt_offset;