This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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.*
+.*
+



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]