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

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


mach-o defaults to starting up with only the text section defined -
the data and bss sections are created on demand and not emitted  
otherwise.

further, it is possible to suppress even the text section, such that  
an object file can contain only specialized sections
(TODO to implement the c/l switch to do this).

this applies on top of part 1.

cheers
Iain

gas:

	* as.c (perform_an_assembly_pass): Do not create text, data and bass  
sections
	for MACH-O.  Do not switch to the text section.
	* config/obj-macho.c (obj_mach_o_segT_from_bfd_name): Forward decl.
	(mach_o_begin): Startup with only text section unless suppressed.
	* config/obj-macho.h (obj_begin): define to mach_o_begin ().

gas/testsuite:

	* gas/mach-o/empty.s: New.
	* gas/mach-o/sections-1.d: Amend to recognize that bss is not emitted  
by default.
	* gas/mach-o/sections-2.d: New.

  gas/as.c                              |    6 ++++++
  gas/config/obj-macho.c                |   27 ++++++++++++++++++++++++ 
+++
  gas/config/obj-macho.h                |    4 ++++
  gas/testsuite/gas/mach-o/empty.s      |    2 ++
  gas/testsuite/gas/mach-o/sections-1.d |    5 -----
  gas/testsuite/gas/mach-o/sections-2.d |   14 ++++++++++++++
  6 files changed, 53 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 1aa24f7..5b32803 100644
--- a/gas/config/obj-macho.c
+++ b/gas/config/obj-macho.c
@@ -45,12 +45,39 @@
  #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.  */
  int 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.  */
  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 (is_static)
+	{
+	  bfd_mach_o_section *mo_sec
+		= OBJ_MACH_O_GET_BACKEND_SECT_DATA (stdoutput, 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 1203cd8..0b62df2 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/empty.s b/gas/testsuite/gas/mach- 
o/empty.s
new file mode 100644
index 0000000..b2b70f4
--- /dev/null
+++ b/gas/testsuite/gas/mach-o/empty.s
@@ -0,0 +1,2 @@
+# nothing here
+
diff --git a/gas/testsuite/gas/mach-o/sections-1.d b/gas/testsuite/gas/ 
mach-o/sections-1.d
index 25ddc25..85d9850 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