2005-07-25  H.J. Lu  <hongjiu.lu@intel.com>

	* elf-bfd.h (elf_backend_data): Add common_definition,
	common_section_index, common_section, and merge_symbol.
	(_bfd_elf_common_definition): New.
	(_bfd_elf_common_section_index): New.
	(_bfd_elf_common_section): New.

	* elf.c (elf_fake_sections): Don't clear sh_flags.

	* elflink.c (_bfd_elf_merge_symbol): Call backend merge_symbol
	if it is available.
	(is_global_data_symbol_definition): Call backend
	common_definition instead of checking SHN_COMMON.
	(elf_link_add_object_symbols): Likewise.
	(elf_link_output_extsym): Call backend common_section_index
	for common section index.
	(_bfd_elf_common_definition): New.
	(_bfd_elf_common_section_index): New.
	(_bfd_elf_common_section): New.

	* elfxx-target.h (elf_backend_common_definition): New.
	(elf_backend_common_section_index): New.
	(elf_backend_common_section): New.
	(elf_backend_merge_symbol): New.
	(elfNN_bed): Initialize common_definition, common_section_index,
	common_section, and merge_symbol.

	* section.c (BFD_FAKE_SECTION): New.
	(STD_SECTION): Use it.
	* bfd-in2.h: Regenerated.
diff --git a/bfd/section.c b/bfd/section.c
index aeb63a6..42554b9 100644
--- a/bfd/section.c
+++ b/bfd/section.c
@@ -635,6 +635,47 @@
 .#define bfd_section_removed_from_list(ABFD, S) \
 .  ((S)->next == NULL ? (ABFD)->section_last != (S) : (S)->next->prev != (S))
 .
+.#define BFD_FAKE_SECTION(SEC, FLAGS, SYM, SYM_PTR, NAME, IDX)		\
+.  {* name, id,  index, next, prev, flags, user_set_vma,            *}	\
+.  { NAME,  IDX, 0,     NULL, NULL, FLAGS, 0,				\
+.									\
+.  {* linker_mark, linker_has_input, gc_mark, gc_mark_from_eh,      *}	\
+.     0,           0,                1,       0,			\
+.									\
+.  {* segment_mark, sec_info_type, use_rela_p, has_tls_reloc,       *}	\
+.     0,            0,             0,          0,			\
+.									\
+.  {* has_gp_reloc, need_finalize_relax, reloc_done,                *}	\
+.     0,            0,                   0,				\
+.									\
+.  {* vma, lma, size, rawsize                                       *}	\
+.     0,   0,   0,    0,						\
+.									\
+.  {* output_offset, output_section,              alignment_power,  *}	\
+.     0,             (struct bfd_section *) &SEC, 0,			\
+.									\
+.  {* relocation, orelocation, reloc_count, filepos, rel_filepos,   *}	\
+.     NULL,       NULL,        0,           0,       0,			\
+.									\
+.  {* line_filepos, userdata, contents, lineno, lineno_count,       *}	\
+.     0,            NULL,     NULL,     NULL,   0,			\
+.									\
+.  {* entsize, kept_section, moving_line_filepos,		     *}	\
+.     0,       NULL,	      0,					\
+.									\
+.  {* target_index, used_by_bfd, constructor_chain, owner,          *}	\
+.     0,            NULL,        NULL,              NULL,		\
+.									\
+.  {* symbol,                                                       *}	\
+.     (struct bfd_symbol *) SYM,					\
+.									\
+.  {* symbol_ptr_ptr,                                               *}	\
+.     (struct bfd_symbol **) SYM_PTR,					\
+.									\
+.  {* map_head, map_tail                                            *}	\
+.     { NULL }, { NULL }						\
+.    }
+.
 */
 
 /* We use a macro to initialize the static asymbol structures because
@@ -662,46 +703,8 @@
 
 #define STD_SECTION(SEC, FLAGS, SYM, NAME, IDX)				\
   const asymbol * const SYM = (asymbol *) &global_syms[IDX]; 		\
-  asection SEC =							\
-    /* name, id,  index, next, prev, flags, user_set_vma,            */	\
-    { NAME,  IDX, 0,     NULL, NULL, FLAGS, 0,				\
-									\
-    /* linker_mark, linker_has_input, gc_mark, gc_mark_from_eh,      */	\
-       0,           0,                1,       0,			\
-									\
-    /* segment_mark, sec_info_type, use_rela_p, has_tls_reloc,       */	\
-       0,            0,             0,          0,			\
-									\
-    /* has_gp_reloc, need_finalize_relax, reloc_done,                */	\
-       0,            0,                   0,				\
-									\
-    /* vma, lma, size, rawsize                                       */	\
-       0,   0,   0,    0,						\
-									\
-    /* output_offset, output_section,              alignment_power,  */	\
-       0,             (struct bfd_section *) &SEC, 0,			\
-									\
-    /* relocation, orelocation, reloc_count, filepos, rel_filepos,   */	\
-       NULL,       NULL,        0,           0,       0,		\
-									\
-    /* line_filepos, userdata, contents, lineno, lineno_count,       */	\
-       0,            NULL,     NULL,     NULL,   0,			\
-									\
-    /* entsize, kept_section, moving_line_filepos,                   */	\
-       0,       NULL,         0,					\
-									\
-    /* target_index, used_by_bfd, constructor_chain, owner,          */	\
-       0,            NULL,        NULL,              NULL,		\
-									\
-    /* symbol,                                                       */	\
-       (struct bfd_symbol *) &global_syms[IDX],				\
-									\
-    /* symbol_ptr_ptr,                                               */	\
-       (struct bfd_symbol **) &SYM,					\
-									\
-    /* map_head, map_tail                                            */	\
-       { NULL }, { NULL }						\
-    }
+  asection SEC = BFD_FAKE_SECTION(SEC, FLAGS, &global_syms[IDX], &SYM,	\
+				  NAME, IDX)
 
 STD_SECTION (bfd_com_section, SEC_IS_COMMON, bfd_com_symbol,
 	     BFD_COM_SECTION_NAME, 0);