Merge pull request #495 from nicolas-raoul/fix-for-issue2907-with-no-formatting-changes
[mono.git] / mono / mini / image-writer.c
index a54b14c5764b5543dc2887690e0f70edcf653ea1..e6d6d928142b51340c5c74658219982eb448b4ca 100644 (file)
@@ -53,7 +53,7 @@
  * TARGET_ASM_GAS == GNU assembler
  */
 #if !defined(TARGET_ASM_APPLE) && !defined(TARGET_ASM_GAS)
-#if defined(__MACH__) && !defined(__native_client_codegen__)
+#if defined(TARGET_MACH) && !defined(__native_client_codegen__)
 #define TARGET_ASM_APPLE
 #else
 #define TARGET_ASM_GAS
@@ -63,7 +63,7 @@
 /*
  * Defines for the directives used by different assemblers
  */
-#if defined(TARGET_POWERPC) || defined(__MACH__)
+#if defined(TARGET_POWERPC) || defined(TARGET_MACH)
 #define AS_STRING_DIRECTIVE ".asciz"
 #else
 #define AS_STRING_DIRECTIVE ".string"
 #define USE_ELF_WRITER 1
 #endif
 
-#if defined(TARGET_ARM) && !defined(__MACH__)
+#if defined(TARGET_ARM) && !defined(TARGET_MACH)
 #define USE_ELF_WRITER 1
 #endif
 
@@ -1070,7 +1070,7 @@ bin_writer_emit_writeout (MonoImageWriter *acfg)
 {
        FILE *file;
        ElfHeader header;
-       ElfProgHeader progh [3];
+       ElfProgHeader progh [4];
        ElfSectHeader secth [SECT_NUM];
 #ifdef USE_ELF_RELA
        ElfRelocA *relocs;
@@ -1336,7 +1336,7 @@ bin_writer_emit_writeout (MonoImageWriter *acfg)
        header.e_phoff = sizeof (header);
        header.e_ehsize = sizeof (header);
        header.e_phentsize = sizeof (ElfProgHeader);
-       header.e_phnum = 3;
+       header.e_phnum = 4;
        header.e_entry = secth [SECT_TEXT].sh_addr;
        header.e_shstrndx = SECT_SHSTRTAB;
        header.e_shentsize = sizeof (ElfSectHeader);
@@ -1407,6 +1407,13 @@ bin_writer_emit_writeout (MonoImageWriter *acfg)
        progh [2].p_align = SIZEOF_VOID_P;
        progh [2].p_flags = 6;
 
+       progh [3].p_type = PT_GNU_STACK;
+       progh [3].p_offset = secth [SECT_DYNAMIC].sh_offset;
+       progh [3].p_vaddr = progh [3].p_paddr = secth [SECT_DYNAMIC].sh_addr;
+       progh [3].p_filesz = progh [3].p_memsz = secth [SECT_DYNAMIC].sh_size;
+       progh [3].p_align = SIZEOF_VOID_P;
+       progh [3].p_flags = 6;
+
        /* Compute the addresses of the bin sections, so relocation can be done */
        for (i = 0; i < SECT_NUM; ++i) {
                if (sections [i]) {
@@ -1617,7 +1624,7 @@ asm_writer_emit_label (MonoImageWriter *acfg, const char *name)
 #if (defined(TARGET_X86) && defined(TARGET_ASM_APPLE))
         name = get_label(name);
         fprintf (acfg->fp, "%s:\n", name);
-        if (name[0] != 'L')
+        if (name[0] != 'L' && name[0] != '_')
             fprintf (acfg->fp, "_%s:\n", name);
 
 #elif (defined(HOST_WIN32) && (defined(TARGET_X86) || defined(TARGET_AMD64))) || (defined(TARGET_X86) && defined(TARGET_ASM_APPLE))
@@ -1751,7 +1758,7 @@ static void
 asm_writer_emit_symbol_diff (MonoImageWriter *acfg, const char *end, const char* start, int offset)
 {
 #ifdef TARGET_ASM_APPLE
-       char symbol [128];
+       //char symbol [128];
 #endif
 
        if (acfg->mode != EMIT_LONG) {
@@ -1782,7 +1789,7 @@ asm_writer_emit_symbol_diff (MonoImageWriter *acfg, const char *end, const char*
 
        if (offset == 0 && strcmp (start, ".") != 0) {
                char symbol [128];
-               sprintf (symbol, ".LDIFF_SYM%d", acfg->label_gen);
+               sprintf (symbol, "%sDIFF_SYM%d", AS_TEMP_LABEL_PREFIX, acfg->label_gen);
                acfg->label_gen ++;
                fprintf (acfg->fp, "\n%s=%s - %s", symbol, end, start);
                fprintf (acfg->fp, "\n\t%s ", AS_INT32_DIRECTIVE);