Rebased : [Patch mach-o 3/3] section directives needed to support GCC

Iain Sandoe developer@sandoe-acoustics.co.uk
Tue Dec 13 14:09:00 GMT 2011


minor tweaks here to deal with the changes to part 2.

On 13 Dec 2011, at 10:38, Tristan Gingold wrote:
> I think this matter (not emitting .data and .bss) is really a detail.

Yes, it is .. and I'm happy to leave until it shows as a bug
..  or just to apply and be the same as the system tools.

>   AFAIK, ld is happy if the sections are empty.

OK. I wasn't sure - don't have complete coverage of ld variants here.

> Anyway, as Alan has approved your changes, I am ok with them.

... here is the rebased patch anyway ...
cheers
Iain

---


  gas/as.c                              |    6 ++++++
  gas/config/obj-macho.c                |   27 ++++++++++++++++++++++++ 
+++
  gas/config/obj-macho.h                |    4 ++++
  gas/testsuite/gas/mach-o/sections-1.d |    5 -----
  gas/testsuite/gas/mach-o/sections-2.d |   14 ++++++++++++++
  5 files changed, 51 insertions(+), 5 deletions(-)

diff --git a/gas/as.c b/gas/as.c
index b99ea1e..1325038 100644
--- a/gas/as.c
+++ b/gas/as.c
@@ -1037,10 +1037,13 @@ static void
  perform_an_assembly_pass (int argc, char ** argv)
  {
    int saw_a_file = 0;
+#ifndef OBJ_MACH_O
    flagword applicable;
+#endif

    need_pass_2 = 0;

+#ifndef OBJ_MACH_O
    /* Create the standard sections, and those the assembler uses
       internally.  */
    text_section = subseg_new (TEXT_SECTION_NAME, 0);
@@ -1057,12 +1060,15 @@ perform_an_assembly_pass (int argc, char **  
argv)
  				       | SEC_DATA));
    bfd_set_section_flags (stdoutput, bss_section, applicable &  
SEC_ALLOC);
    seg_info (bss_section)->bss = 1;
+#endif
    subseg_new (BFD_ABS_SECTION_NAME, 0);
    subseg_new (BFD_UND_SECTION_NAME, 0);
    reg_section = subseg_new ("*GAS `reg' section*", 0);
    expr_section = subseg_new ("*GAS `expr' section*", 0);

+#ifndef OBJ_MACH_O
    subseg_set (text_section, 0);
+#endif

    /* This may add symbol table entries, which requires having an  
open BFD,
       and sections already created.  */
diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c
index 018f653..4e55ee4 100644
--- a/gas/config/obj-macho.c
+++ b/gas/config/obj-macho.c
@@ -45,14 +45,41 @@
  #include "mach-o/loader.h"
  #include "obj-macho.h"

+/* Forward decl.  */
+static segT obj_mach_o_segT_from_bfd_name (const char *nam, int  
must_succeed);
+
  /* TODO: Implement "-dynamic"/"-static" command line options.  */

  static int obj_mach_o_is_static;

+/* TODO: Implement the "-n" command line option to suppress the initial
+   switch to the text segment.  */
+int start_with_text_section = 1;
+
  /* Allow for special re-ordering on output.  */

  static int seen_objc_section;

+/* Start-up: At present, just create the sections we want.  */
+void
+mach_o_begin (void)
+{
+  /* Mach-O only defines the .text section by default, and even this  
can
+     be suppressed by a flag.  In the latter event, the first code MUST
+     be a section definition.  */
+  if (start_with_text_section)
+    {
+      text_section = obj_mach_o_segT_from_bfd_name  
(TEXT_SECTION_NAME, 1);
+      subseg_set (text_section, 0);
+      if (obj_mach_o_is_static)
+	{
+	  bfd_mach_o_section *mo_sec
+			= bfd_mach_o_get_mach_o_section (text_section);
+	  mo_sec->flags &= ~BFD_MACH_O_S_ATTR_PURE_INSTRUCTIONS;
+	}
+    }
+}
+
  static void
  obj_mach_o_weak (int ignore ATTRIBUTE_UNUSED)
  {
diff --git a/gas/config/obj-macho.h b/gas/config/obj-macho.h
index 94c1cde..d9b0b33 100644
--- a/gas/config/obj-macho.h
+++ b/gas/config/obj-macho.h
@@ -30,6 +30,10 @@

  #define OUTPUT_FLAVOR bfd_target_mach_o_flavour

+/* We want to control how the sections are pre-defined on startup.  */
+#define obj_begin() mach_o_begin ()
+extern void mach_o_begin (void);
+
  /* All our align expressions are power of two.  */
  #define USE_ALIGN_PTWO

diff --git a/gas/testsuite/gas/mach-o/sections-1.d b/gas/testsuite/gas/ 
mach-o/sections-1.d
index a70af9b..5b8a8fa 100644
--- a/gas/testsuite/gas/mach-o/sections-1.d
+++ b/gas/testsuite/gas/mach-o/sections-1.d
@@ -11,11 +11,6 @@
    align: 0  nreloc: 0  reloff: (00000000)?00000000
    flags: 00000000 \(type: regular attr: -\)
    reserved1: 0x0  reserved2: 0x0  reserved3: 0x0
- Section: __bss            __DATA           \(bfdname: .bss\)
-  addr: (00000000)?00000000 size: (00000000)?00000000 offset:  
(00000000)?00000000
-  align: 0  nreloc: 0  reloff: (00000000)?00000000
-  flags: 00000001 \(type: zerofill attr: -\)
-  reserved1: 0x0  reserved2: 0x0  reserved3: 0x0
   Section: __textcoal_nt    __TEXT           \(bfdname:  
__TEXT.__textcoal_nt\)
    addr: (00000000)?00000000 size: (00000000)?00000000 offset:  
(00000000)?00000000
    align: 0  nreloc: 0  reloff: (00000000)?00000000
diff --git a/gas/testsuite/gas/mach-o/sections-2.d b/gas/testsuite/gas/ 
mach-o/sections-2.d
new file mode 100644
index 0000000..9d24f9a
--- /dev/null
+++ b/gas/testsuite/gas/mach-o/sections-2.d
@@ -0,0 +1,14 @@
+#objdump: -h
+#source: empty.s
+# we should only see a text section by default.
+.*: +file format mach-o.*
+#...
+Idx Name.*
+  0 .text.*
+.*
+#failif
+  1 .data.*
+.*
+  2 .bss.*
+.*
+



More information about the Binutils mailing list