revised : [Patch mach-o/gas] make section type names target-dependent.

Iain Sandoe developer@sandoe-acoustics.co.uk
Sat Dec 17 12:22:00 GMT 2011


when I merged this back into my symbol-qualifier branch, I found it  
was not improving error handling at all - owing to a typo.
I've simplified it now - there seems no point in carrying on the  
parsing once the line is known to be broken.

ChangeLogs and general comments the same.

On 16 Dec 2011, at 20:34, Iain Sandoe wrote:

> I am trying to test the four main Darwin targets as I implement  
> things ..
> .. the Idea being that, one day, we will simply be able to enable  
> them all in configure...
>
> Testing my current stuff (for symbol type qualifiers) reminded me  
> that some section types are not applicable to all targets.
> (At present, specifically, that means that x86-64 doesn't support  
> symbol stubs, or {non,}lazy_symbol_stubs).
>
> The patch below checks for a target-specific table ahead of the  
> generic one.
> I followed the current style of printing in binutils/od-macho.c and  
> parsing in bfd/mach-o.c although I wonder if it might be more  
> obvious to put them both back into bfd/mach-o.c and just publish the  
> accessor routines.

OK?
Iain

> bfd:
>
> 	* mach-o-i386.c (mach_o_i386_section_type_names): New.
> 	(bfd_mach_o_tgt_section_type_names): Use  
> mach_o_i386_section_type_names.
> 	* mach-o-target.c (bfd_mach_o_tgt_section_type_names): New  
> initializer.
> 	* mach-o-x86-64.c (bfd_mach_o_tgt_section_type_names): Initialize  
> to NULL.
> 	* mach-o.c (bfd_mach_o_section_type_name): Remove target-dependent  
> entries.
> 	(mach_o_default_additional_section_type_names): New.
> 	(bfd_mach_o_get_section_type_from_name): Look for target-specific  
> entries.
> 	(bfd_mach_o_tgt_section_type_names): Use default additions for  
> {le,be}_vec.
> 	* mach-o.h (bfd_mach_o_get_section_type_from_name): Alter  
> definition to include
> 	bfd.
>
> binutils:
>
> 	* od-macho.c (dump_section): Account for target-dependent section  
> types.
>
> gas:
>
> 	* config/obj-macho.c (obj_mach_o_section): Account for target- 
> dependent section
> 	types.  Improve error handling when wrong section types/attributes  
> are specified.
>
> gas/testsuite:
>
> 	* gas/mach-o/err-sections-1.s: New.
> 	* gas/mach-o/err-sections-2.s: New.
> 	* gas/mach-o/sections-3.d: New.
> 	* gas/mach-o/sections-3.s: New.

  bfd/mach-o-i386.c                         |    9 ++++++
  bfd/mach-o-target.c                       |    3 +-
  bfd/mach-o-x86-64.c                       |    1 +
  bfd/mach-o.c                              |   22 ++++++++++++---
  bfd/mach-o.h                              |    3 +-
  binutils/od-macho.c                       |   16 ++++++++---
  gas/config/obj-macho.c                    |   41 ++++++++++++++++++ 
+---------
  gas/testsuite/gas/mach-o/err-sections-1.s |    9 ++++++
  gas/testsuite/gas/mach-o/err-sections-2.s |    9 ++++++
  gas/testsuite/gas/mach-o/sections-3.d     |   19 +++++++++++++
  gas/testsuite/gas/mach-o/sections-3.s     |    7 +++++
  11 files changed, 115 insertions(+), 24 deletions(-)

diff --git a/bfd/mach-o-i386.c b/bfd/mach-o-i386.c
index 3dadcb8..2d92075 100644
--- a/bfd/mach-o-i386.c
+++ b/bfd/mach-o-i386.c
@@ -333,11 +333,20 @@ const mach_o_segment_name_xlat  
mach_o_i386_segsec_names_xlat[] =
      { NULL, NULL }
    };

+const bfd_mach_o_xlat_name mach_o_i386_section_type_names[] =
+{
+  { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS},
+  { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS},
+  { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
+  { NULL, 0}
+};
+
  #define bfd_mach_o_swap_reloc_in bfd_mach_o_i386_swap_reloc_in
  #define bfd_mach_o_swap_reloc_out bfd_mach_o_i386_swap_reloc_out
  #define bfd_mach_o_print_thread bfd_mach_o_i386_print_thread

  #define bfd_mach_o_tgt_seg_table mach_o_i386_segsec_names_xlat
+#define bfd_mach_o_tgt_section_type_names  
mach_o_i386_section_type_names

  #define bfd_mach_o_bfd_reloc_type_lookup  
bfd_mach_o_i386_bfd_reloc_type_lookup
  #define bfd_mach_o_bfd_reloc_name_lookup  
bfd_mach_o_i386_bfd_reloc_name_lookup
diff --git a/bfd/mach-o-target.c b/bfd/mach-o-target.c
index 4aeb920..3d4b494 100644
--- a/bfd/mach-o-target.c
+++ b/bfd/mach-o-target.c
@@ -96,7 +96,8 @@ static const bfd_mach_o_backend_data  
TARGET_NAME_BACKEND =
    bfd_mach_o_swap_reloc_in,
    bfd_mach_o_swap_reloc_out,
    bfd_mach_o_print_thread,
-  bfd_mach_o_tgt_seg_table
+  bfd_mach_o_tgt_seg_table,
+  bfd_mach_o_tgt_section_type_names
  };

  const bfd_target TARGET_NAME =
diff --git a/bfd/mach-o-x86-64.c b/bfd/mach-o-x86-64.c
index c86efb7..0abd319 100644
--- a/bfd/mach-o-x86-64.c
+++ b/bfd/mach-o-x86-64.c
@@ -288,6 +288,7 @@ bfd_mach_o_x86_64_bfd_reloc_name_lookup (bfd *abfd  
ATTRIBUTE_UNUSED,
  #define bfd_mach_o_bfd_reloc_name_lookup  
bfd_mach_o_x86_64_bfd_reloc_name_lookup
  #define bfd_mach_o_print_thread NULL
  #define bfd_mach_o_tgt_seg_table NULL
+#define bfd_mach_o_tgt_section_type_names NULL

  #define TARGET_NAME 		mach_o_x86_64_vec
  #define TARGET_STRING 		"mach-o-x86-64"
diff --git a/bfd/mach-o.c b/bfd/mach-o.c
index dca8601..edd5ce5 100644
--- a/bfd/mach-o.c
+++ b/bfd/mach-o.c
@@ -3558,9 +3558,6 @@ const bfd_mach_o_xlat_name  
bfd_mach_o_section_type_name[] =
    { "4byte_literals", BFD_MACH_O_S_4BYTE_LITERALS},
    { "8byte_literals", BFD_MACH_O_S_8BYTE_LITERALS},
    { "literal_pointers", BFD_MACH_O_S_LITERAL_POINTERS},
-  { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS},
-  { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS},
-  { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
    { "mod_init_func_pointers", BFD_MACH_O_S_MOD_INIT_FUNC_POINTERS},
    { "mod_fini_func_pointers", BFD_MACH_O_S_MOD_FINI_FUNC_POINTERS},
    { "coalesced", BFD_MACH_O_S_COALESCED},
@@ -3568,7 +3565,6 @@ const bfd_mach_o_xlat_name  
bfd_mach_o_section_type_name[] =
    { "interposing", BFD_MACH_O_S_INTERPOSING},
    { "16byte_literals", BFD_MACH_O_S_16BYTE_LITERALS},
    { "dtrace_dof", BFD_MACH_O_S_DTRACE_DOF},
-  { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
    { "lazy_dylib_symbol_pointers",  
BFD_MACH_O_S_LAZY_DYLIB_SYMBOL_POINTERS},
    { NULL, 0}
  };
@@ -3589,12 +3585,27 @@ const bfd_mach_o_xlat_name  
bfd_mach_o_section_attribute_name[] =
    { NULL, 0}
  };

+const bfd_mach_o_xlat_name  
mach_o_default_additional_section_type_names[] =
+{
+  { "non_lazy_symbol_pointers", BFD_MACH_O_S_NON_LAZY_SYMBOL_POINTERS},
+  { "lazy_symbol_pointers", BFD_MACH_O_S_LAZY_SYMBOL_POINTERS},
+  { "symbol_stubs", BFD_MACH_O_S_SYMBOL_STUBS},
+  { NULL, 0}
+};
+
  /* Get the section type from NAME.  Return 256 if NAME is unknown.  */

  unsigned int
-bfd_mach_o_get_section_type_from_name (const char *name)
+bfd_mach_o_get_section_type_from_name (bfd *abfd, const char *name)
  {
    const bfd_mach_o_xlat_name *x;
+  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
+
+  /* First try any target-specific translations defined...  */
+  if (bed->section_type_names)
+    for (x = bed->section_type_names; x->name; x++)
+      if (strcmp (x->name, name) == 0)
+	return x->val;

    for (x = bfd_mach_o_section_type_name; x->name; x++)
      if (strcmp (x->name, name) == 0)
@@ -3785,6 +3796,7 @@ bfd_boolean bfd_mach_o_free_cached_info (bfd  
*abfd)
  #define bfd_mach_o_swap_reloc_out NULL
  #define bfd_mach_o_print_thread NULL
  #define bfd_mach_o_tgt_seg_table NULL
+#define bfd_mach_o_tgt_section_type_names  
mach_o_default_additional_section_type_names

  #define TARGET_NAME 		mach_o_be_vec
  #define TARGET_STRING     	"mach-o-be"
diff --git a/bfd/mach-o.h b/bfd/mach-o.h
index 23c3e1c..af688c2 100644
--- a/bfd/mach-o.h
+++ b/bfd/mach-o.h
@@ -584,7 +584,7 @@ bfd_boolean bfd_mach_o_set_section_contents (bfd  
*, asection *, const void *,
                                               file_ptr, bfd_size_type);
  unsigned int bfd_mach_o_version (bfd *);

-unsigned int bfd_mach_o_get_section_type_from_name (const char *);
+unsigned int bfd_mach_o_get_section_type_from_name (bfd *, const char  
*);
  unsigned int bfd_mach_o_get_section_attribute_from_name (const char  
*);

  void bfd_mach_o_convert_section_name_to_bfd (bfd *, const char *,  
const char *,
@@ -636,6 +636,7 @@ typedef struct bfd_mach_o_backend_data
    bfd_boolean (*_bfd_mach_o_print_thread)(bfd *,  
bfd_mach_o_thread_flavour *,
                                            void *, char *);
    const mach_o_segment_name_xlat *segsec_names_xlat;
+  const bfd_mach_o_xlat_name *section_type_names;
  }
  bfd_mach_o_backend_data;

diff --git a/binutils/od-macho.c b/binutils/od-macho.c
index c5e315d..b13d2f9 100644
--- a/binutils/od-macho.c
+++ b/binutils/od-macho.c
@@ -314,8 +314,12 @@ dump_section_map (bfd *abfd)
  }

  static void
-dump_section (bfd *abfd ATTRIBUTE_UNUSED, bfd_mach_o_section *sec)
+dump_section (bfd *abfd, bfd_mach_o_section *sec)
  {
+  bfd_mach_o_backend_data *bed = bfd_mach_o_get_backend_data (abfd);
+  const char * secttype_name = NULL;
+  unsigned typ = sec->flags & BFD_MACH_O_SECTION_TYPE_MASK;
+
    printf (" Section: %-16s %-16s (bfdname: %s)\n",
             sec->sectname, sec->segname, sec->bfdsection->name);
    printf ("  addr: ");
@@ -329,9 +333,13 @@ dump_section (bfd *abfd ATTRIBUTE_UNUSED,  
bfd_mach_o_section *sec)
    printf ("  nreloc: %lu  reloff: ", sec->nreloc);
    printf_vma (sec->reloff);
    printf ("\n");
-  printf ("  flags: %08lx (type: %s", sec->flags,
-          bfd_mach_o_get_name (bfd_mach_o_section_type_name,
-                               sec->flags &  
BFD_MACH_O_SECTION_TYPE_MASK));
+  if (bed->section_type_names != NULL)
+    secttype_name = bfd_mach_o_get_name_or_null (bed- 
 >section_type_names,
+						 typ);
+  if (secttype_name == NULL)
+    secttype_name = bfd_mach_o_get_name  
(bfd_mach_o_section_type_name,typ);
+
+  printf ("  flags: %08lx (type: %s", sec->flags, secttype_name);
    printf (" attr: ");
    bfd_mach_o_print_flags (bfd_mach_o_section_attribute_name,
                            sec->flags &  
BFD_MACH_O_SECTION_ATTRIBUTES_MASK);
diff --git a/gas/config/obj-macho.c b/gas/config/obj-macho.c
index 0852cde..be1c9ff 100644
--- a/gas/config/obj-macho.c
+++ b/gas/config/obj-macho.c
@@ -169,6 +169,10 @@ obj_mach_o_section (int ignore ATTRIBUTE_UNUSED)
    char segname[17];
    char sectname[17];

+#ifdef md_flush_pending_output
+  md_flush_pending_output ();
+#endif
+
    /* Zero-length segment and section names are allowed.  */
    /* Parse segment name.  */
    memset (segname, 0, sizeof(segname));
@@ -203,16 +207,18 @@ obj_mach_o_section (int ignore ATTRIBUTE_UNUSED)

        /* Temporarily make a string from the token.  */
        p[len] = 0;
-      sectype = bfd_mach_o_get_section_type_from_name (p);
+      sectype = bfd_mach_o_get_section_type_from_name (stdoutput, p);
        if (sectype > 255) /* Max Section ID == 255.  */
          {
            as_bad (_("unknown or invalid section type '%s'"), p);
-          sectype = BFD_MACH_O_S_REGULAR;
+	  p[len] = tmpc;
+	  ignore_rest_of_line ();
+	  return;
          }
        else
  	sectype_given = 1;
        /* Restore.  */
-      tmpc = p[len];
+      p[len] = tmpc;

        /* Parse attributes.
  	 TODO: check validity of attributes for section type.  */
@@ -241,7 +247,12 @@ obj_mach_o_section (int ignore ATTRIBUTE_UNUSED)
  	      p[len] ='\0';
                attr = bfd_mach_o_get_section_attribute_from_name (p);
  	      if (attr == -1)
-                as_bad (_("unknown or invalid section attribute  
'%s'"), p);
+		{
+                  as_bad (_("unknown or invalid section attribute  
'%s'"), p);
+		  p[len] = tmpc;
+		  ignore_rest_of_line ();
+		  return;
+                }
                else
  		{
  		  secattr_given = 1;
@@ -253,19 +264,26 @@ obj_mach_o_section (int ignore ATTRIBUTE_UNUSED)
            while (*input_line_pointer == '+');

            /* Parse sizeof_stub.  */
-          if (*input_line_pointer == ',')
+          if (secattr_given && *input_line_pointer == ',')
              {
                if (sectype != BFD_MACH_O_S_SYMBOL_STUBS)
-                as_bad (_("unexpected sizeof_stub expression"));
+                {
+		  as_bad (_("unexpected section size information"));
+		  ignore_rest_of_line ();
+		  return;
+		}

  	      input_line_pointer++;
                sizeof_stub = get_absolute_expression ();
              }
-          else if (sectype == BFD_MACH_O_S_SYMBOL_STUBS)
-            as_bad (_("missing sizeof_stub expression"));
+          else if (secattr_given && sectype ==  
BFD_MACH_O_S_SYMBOL_STUBS)
+            {
+              as_bad (_("missing sizeof_stub expression"));
+	      ignore_rest_of_line ();
+	      return;
+            }
          }
      }
-  demand_empty_rest_of_line ();

    flags = SEC_NO_FLAGS;
    /* This provides default bfd flags and default mach-o section type  
and
@@ -296,10 +314,6 @@ obj_mach_o_section (int ignore ATTRIBUTE_UNUSED)
        name = n;
      }

-#ifdef md_flush_pending_output
-  md_flush_pending_output ();
-#endif
-
    /* Sub-segments don't exists as is on Mach-O.  */
    sec = subseg_new (name, 0);

@@ -334,6 +348,7 @@ obj_mach_o_section (int ignore ATTRIBUTE_UNUSED)
  	  || msect->flags != (secattr | sectype))
  	as_warn (_("Ignoring changed section attributes for %s"), name);
      }
+  demand_empty_rest_of_line ();
  }

  static segT
diff --git a/gas/testsuite/gas/mach-o/err-sections-1.s b/gas/testsuite/ 
gas/mach-o/err-sections-1.s
new file mode 100644
index 0000000..99447a7
--- /dev/null
+++ b/gas/testsuite/gas/mach-o/err-sections-1.s
@@ -0,0 +1,9 @@
+# { dg-do assemble { target x86_64-*-darwin* } }
+
+	.section __a,__b,symbol_stubs,strip_static_syms,4	
+	.section __a,__c,lazy_symbol_pointers,strip_static_syms,4
+	.section __a,__d,non_lazy_symbol_pointers,strip_static_syms,4
+
+# { dg-error "unknown or invalid section type .symbol_stubs."  
"" { target x86_64-*-darwin* } 3 }
+# { dg-error "unknown or invalid section type .lazy_symbol_pointers."  
"" { target x86_64-*-darwin* } 4 }
+# { dg-error "unknown or invalid section  
type .non_lazy_symbol_pointers." "" { target x86_64-*-darwin* } 5 }
diff --git a/gas/testsuite/gas/mach-o/err-sections-2.s b/gas/testsuite/ 
gas/mach-o/err-sections-2.s
new file mode 100644
index 0000000..3343066
--- /dev/null
+++ b/gas/testsuite/gas/mach-o/err-sections-2.s
@@ -0,0 +1,9 @@
+# { dg-do assemble { target x86_64-*-darwin* } }
+
+	.symbol_stub	
+	.lazy_symbol_pointer	
+	.non_lazy_symbol_pointer
+
+# { dg-error ".symbol_stub is not used for the selected target"  
"" { target x86_64-*-darwin* } 3 }
+# { dg-error ".lazy_symbol_pointer is not used for the selected  
target" "" { target x86_64-*-darwin* } 4 }
+# { dg-error ".non_lazy_symbol_pointer is not used for the selected  
target" "" { target x86_64-*-darwin* } 5 }
diff --git a/gas/testsuite/gas/mach-o/sections-3.d b/gas/testsuite/gas/ 
mach-o/sections-3.d
new file mode 100644
index 0000000..9d1daf4
--- /dev/null
+++ b/gas/testsuite/gas/mach-o/sections-3.d
@@ -0,0 +1,19 @@
+#objdump: -P section
+#not-target: x86_64-*-darwin*
+.*: +file format mach-o.*
+#...
+ Section: __symbol_stub    __TEXT.*\(bfdname: .symbol_stub\)
+  addr: (00000000)?00000000 size: (00000000)?00000000 offset:  
(00000000)?00000000
+  align: 0  nreloc: 0  reloff: (00000000)?00000000
+  flags: 80000008 \(type: symbol_stubs attr: pure_instructions\)
+  first indirect sym: 0 \(0 entries\)  stub size: (16|20)  reserved3:  
0x0
+ Section: __la_symbol_ptr  __DATA.*\(bfdname: .lazy_symbol_pointer\)
+  addr: (00000000)?00000000 size: (00000000)?00000000 offset:  
(00000000)?00000000
+  align: 2  nreloc: 0  reloff: (00000000)?00000000
+  flags: 00000007 \(type: lazy_symbol_pointers attr: -\)
+  first indirect sym: 0 \(0 entries\)  reserved2: 0x0  reserved3: 0x0
+ Section: __nl_symbol_ptr  __DATA.*\(bfdname: .non_lazy_symbol_pointer 
\)
+  addr: (00000000)?00000000 size: (00000000)?00000000 offset:  
(00000000)?00000000
+  align: 2  nreloc: 0  reloff: (00000000)?00000000
+  flags: 00000006 \(type: non_lazy_symbol_pointers attr: -\)
+  first indirect sym: 0 \(0 entries\)  reserved2: 0x0  reserved3: 0x0
diff --git a/gas/testsuite/gas/mach-o/sections-3.s b/gas/testsuite/gas/ 
mach-o/sections-3.s
new file mode 100644
index 0000000..17fae52
--- /dev/null
+++ b/gas/testsuite/gas/mach-o/sections-3.s
@@ -0,0 +1,7 @@
+
+	.symbol_stub
+	
+	.lazy_symbol_pointer
+	
+	.non_lazy_symbol_pointer
+



More information about the Binutils mailing list