#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)
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);
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);
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);
}
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);
/* 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);
* 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);
}
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);
*/
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);
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);
/* 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);
*/
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);
/* 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);
/* 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);
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);
}
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);
SECT_TEXT,
SECT_DYNAMIC,
SECT_GOT_PLT,
+ SECT_RODATA,
SECT_DATA,
SECT_BSS,
SECT_DEBUG_FRAME,
{".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},
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;
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)
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;