This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: Rebased : [Patch mach-o 3/3] section directives needed to support GCC
On Dec 13, 2011, at 3:08 PM, Iain Sandoe wrote:
> 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 …
Last minute minor issue: local variable in obj-macho.c. See below.
> 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;
Static + obj_mach_o prefix would be nice!
Thanks,
Tristan.
> +
> /* 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.*
> +.*
> +
>