This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[Patch mach-o 3/3] section directives needed to support GCC
- From: Iain Sandoe <developer at sandoe-acoustics dot co dot uk>
- To: binutils at sourceware dot org
- Cc: Tristan Gingold <gingold at adacore dot com>
- Date: Tue, 13 Dec 2011 02:23:28 +0000
- Subject: [Patch mach-o 3/3] section directives needed to support GCC
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.*
+.*
+