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]

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


On Dec 13, 2011, at 3:23 AM, Iain Sandoe wrote:

> 
> 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).

As this touches common code, I can't approve it.

An alternative is to remove these sections unless they are not empty (ok, slightly different semantic).  Here is what I wrote to achieve that:

+++ b/gas/config/obj-macho.c
@@ -431,5 +431,21 @@ obj_mach_o_set_subsections (bfd *abfd ATTRIBUTE_UNUSED,
 void
 obj_mach_o_frob_file_before_adjust (void)
 {
+#if 1
+  /* Do not write the data and bss section if they are empty.  This matches
+     original assembler behaviour.  */
+  /* FIXME: do this like reg_section ?  */
+  if (bfd_section_size (stdoutput, data_section) == 0)
+    {
+      bfd_section_list_remove (stdoutput, data_section);
+      stdoutput->section_count--;
+    }
+  if (bfd_section_size (stdoutput, bss_section) == 0)
+    {
+      bfd_section_list_remove (stdoutput, bss_section);
+      stdoutput->section_count--;
+    }
+#endif
+
   bfd_map_over_sections (stdoutput, obj_mach_o_set_subsections, (char *) 0);
 }

Tristan.

> 
> 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]