Patchwork [google/gcc-4_6_2-mobile] PATCH: PR other/46770: Replace .ctors/.dtors with .init_array/.fini_array on targets supporting them

login
register
mail settings
Submitter H.J. Lu
Date Feb. 18, 2012, 1:20 a.m.
Message ID <20120218012001.GA19585@intel.com>
Download mbox | patch
Permalink /patch/142027/
State New
Headers show

Comments

H.J. Lu - Feb. 18, 2012, 1:20 a.m.
Hi,

This patch backports the fix from trunk:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46770

for google/gcc-4_6_2-mobile branch.  This is needed to support C++
global constructors/destructiors on Android/x86.  OK for
google/gcc-4_6_2-mobile branch?

Thanks.

H.J.
---
2011-08-20  H.J. Lu  <hongjiu.lu@intel.com>

	PR other/46770
	* config.gcc (tm_file): Add initfini-array.h if
	.init_arrary/.fini_array are supported.

	* crtstuff.c: Don't generate .ctors nor .dtors sections if
	USE_INITFINI_ARRAY is defined.

	* output.h (default_elf_init_array_asm_out_constructor): New.
	(default_elf_fini_array_asm_out_destructor): Likewise.
	* varasm.c (elf_init_array_section): Likewise.
	(elf_fini_array_section): Likewise.
	(get_elf_initfini_array_priority_section): Likewise.
	(default_elf_init_array_asm_out_constructor): Likewise.
	(default_elf_fini_array_asm_out_destructor): Likewise.

	* config/initfini-array.h: New.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@177933 138bc75d-0d04-0410-961f-82ee72b054a4

Conflicts:

	gcc/ChangeLog
---
 gcc/ChangeLog.hjl           |   21 +++++++++++++++
 gcc/config.gcc              |    5 +++
 gcc/config/initfini-array.h |   37 +++++++++++++++++++++++++++
 gcc/crtstuff.c              |   11 +++++++-
 gcc/output.h                |    2 +
 gcc/varasm.c                |   58 +++++++++++++++++++++++++++++++++++++++++++
 6 files changed, 133 insertions(+), 1 deletions(-)
 create mode 100644 gcc/ChangeLog.hjl
 create mode 100644 gcc/config/initfini-array.h
Jing Yu - Feb. 18, 2012, 4:25 a.m.
OK. Thanks for porting the patch.
I will commit the patch into google/gcc-4_6_2-mobile for you.

I would also like to commit it into google/gcc-4_6 branch if all tests
pass. This patch is almost the same as Google Ref 47894.

Thanks,
Jing

On Fri, Feb 17, 2012 at 5:20 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> Hi,
>
> This patch backports the fix from trunk:
>
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46770
>
> for google/gcc-4_6_2-mobile branch.  This is needed to support C++
> global constructors/destructiors on Android/x86.  OK for
> google/gcc-4_6_2-mobile branch?
>
> Thanks.
>
> H.J.
> ---
> 2011-08-20  H.J. Lu  <hongjiu.lu@intel.com>
>
>        PR other/46770
>        * config.gcc (tm_file): Add initfini-array.h if
>        .init_arrary/.fini_array are supported.
>
>        * crtstuff.c: Don't generate .ctors nor .dtors sections if
>        USE_INITFINI_ARRAY is defined.
>
>        * output.h (default_elf_init_array_asm_out_constructor): New.
>        (default_elf_fini_array_asm_out_destructor): Likewise.
>        * varasm.c (elf_init_array_section): Likewise.
>        (elf_fini_array_section): Likewise.
>        (get_elf_initfini_array_priority_section): Likewise.
>        (default_elf_init_array_asm_out_constructor): Likewise.
>        (default_elf_fini_array_asm_out_destructor): Likewise.
>
>        * config/initfini-array.h: New.
>
> git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@177933 138bc75d-0d04-0410-961f-82ee72b054a4
>
> Conflicts:
>
>        gcc/ChangeLog
> ---
>  gcc/ChangeLog.hjl           |   21 +++++++++++++++
>  gcc/config.gcc              |    5 +++
>  gcc/config/initfini-array.h |   37 +++++++++++++++++++++++++++
>  gcc/crtstuff.c              |   11 +++++++-
>  gcc/output.h                |    2 +
>  gcc/varasm.c                |   58 +++++++++++++++++++++++++++++++++++++++++++
>  6 files changed, 133 insertions(+), 1 deletions(-)
>  create mode 100644 gcc/ChangeLog.hjl
>  create mode 100644 gcc/config/initfini-array.h
>
> diff --git a/gcc/ChangeLog.hjl b/gcc/ChangeLog.hjl
> new file mode 100644
> index 0000000..3527b27
> --- /dev/null
> +++ b/gcc/ChangeLog.hjl
> @@ -0,0 +1,21 @@
> +2011-12-07  H.J. Lu  <hongjiu.lu@intel.com>
> +
> +       Backport from mainline
> +       2011-08-20  H.J. Lu  <hongjiu.lu@intel.com>
> +
> +       PR other/46770
> +       * config.gcc (tm_file): Add initfini-array.h if
> +       .init_arrary/.fini_array are supported.
> +
> +       * crtstuff.c: Don't generate .ctors nor .dtors sections if
> +       USE_INITFINI_ARRAY is defined.
> +
> +       * output.h (default_elf_init_array_asm_out_constructor): New.
> +       (default_elf_fini_array_asm_out_destructor): Likewise.
> +       * varasm.c (elf_init_array_section): Likewise.
> +       (elf_fini_array_section): Likewise.
> +       (get_elf_initfini_array_priority_section): Likewise.
> +       (default_elf_init_array_asm_out_constructor): Likewise.
> +       (default_elf_fini_array_asm_out_destructor): Likewise.
> +
> +       * config/initfini-array.h: New.
> diff --git a/gcc/config.gcc b/gcc/config.gcc
> index d9ac0fa..b386424 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -3176,6 +3176,11 @@ if test x$with_schedule = x; then
>        esac
>  fi
>
> +# Support --enable-initfini-array.
> +if test x$enable_initfini_array = xyes; then
> +  tm_file="${tm_file} initfini-array.h"
> +fi
> +
>  # Validate and mark as valid any --with options supported
>  # by this target.  In order to use a particular --with option
>  # you must list it in supported_defaults; validating the value
> diff --git a/gcc/config/initfini-array.h b/gcc/config/initfini-array.h
> new file mode 100644
> index 0000000..8aaadf6
> --- /dev/null
> +++ b/gcc/config/initfini-array.h
> @@ -0,0 +1,37 @@
> +/* Definitions for ELF systems with .init_array/.fini_array section
> +   support.
> +   Copyright (C) 2011
> +   Free Software Foundation, Inc.
> +
> +   This file is part of GCC.
> +
> +   GCC is free software; you can redistribute it and/or modify it
> +   under the terms of the GNU General Public License as published
> +   by the Free Software Foundation; either version 3, or (at your
> +   option) any later version.
> +
> +   GCC is distributed in the hope that it will be useful, but WITHOUT
> +   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
> +   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
> +   License for more details.
> +
> +   You should have received a copy of the GNU General Public License
> +   along with GCC; see the file COPYING3.  If not see
> +   <http://www.gnu.org/licenses/>.  */
> +
> +#define USE_INITFINI_ARRAY
> +
> +#undef INIT_SECTION_ASM_OP
> +#undef FINI_SECTION_ASM_OP
> +
> +#undef INIT_ARRAY_SECTION_ASM_OP
> +#define INIT_ARRAY_SECTION_ASM_OP
> +
> +#undef FINI_ARRAY_SECTION_ASM_OP
> +#define FINI_ARRAY_SECTION_ASM_OP
> +
> +/* Use .init_array/.fini_array section for constructors and destructors. */
> +#undef TARGET_ASM_CONSTRUCTOR
> +#define TARGET_ASM_CONSTRUCTOR default_elf_init_array_asm_out_constructor
> +#undef TARGET_ASM_DESTRUCTOR
> +#define TARGET_ASM_DESTRUCTOR default_elf_fini_array_asm_out_destructor
> diff --git a/gcc/crtstuff.c b/gcc/crtstuff.c
> index b65f490..010d472 100644
> --- a/gcc/crtstuff.c
> +++ b/gcc/crtstuff.c
> @@ -1,7 +1,8 @@
>  /* Specialized bits of code needed to support construction and
>    destruction of file-scope objects in C++ code.
>    Copyright (C) 1991, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
> -   2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
> +   2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011
> +   Free Software Foundation, Inc.
>    Contributed by Ron Guilmette (rfg@monkeys.com).
>
>  This file is part of GCC.
> @@ -189,6 +190,9 @@ typedef void (*func_ptr) (void);
>    refer to only the __CTOR_END__ symbol in crtend.o and the __DTOR_LIST__
>    symbol in crtbegin.o, where they are defined.  */
>
> +/* No need for .ctors/.dtors section if linker can place them in
> +   .init_array/.fini_array section.  */
> +#ifndef USE_INITFINI_ARRAY
>  /* The -1 is a flag to __do_global_[cd]tors indicating that this table
>    does not start with a count of elements.  */
>  #ifdef CTOR_LIST_BEGIN
> @@ -219,6 +223,7 @@ STATIC func_ptr __DTOR_LIST__[1]
>   __attribute__((section(".dtors"), aligned(sizeof(func_ptr))))
>   = { (func_ptr) (-1) };
>  #endif /* __DTOR_LIST__ alternatives */
> +#endif /* USE_INITFINI_ARRAY */
>
>  #ifdef USE_EH_FRAME_REGISTRY
>  /* Stick a label at the beginning of the frame unwind info so we can register
> @@ -489,6 +494,9 @@ __do_global_ctors_1(void)
>
>  #elif defined(CRT_END) /* ! CRT_BEGIN */
>
> +/* No need for .ctors/.dtors section if linker can place them in
> +   .init_array/.fini_array section.  */
> +#ifndef USE_INITFINI_ARRAY
>  /* Put a word containing zero at the end of each of our two lists of function
>    addresses.  Note that the words defined here go into the .ctors and .dtors
>    sections of the crtend.o file, and since that file is always linked in
> @@ -534,6 +542,7 @@ STATIC func_ptr __DTOR_END__[1]
>   __attribute__((used, section(".dtors"), aligned(sizeof(func_ptr))))
>   = { (func_ptr) 0 };
>  #endif
> +#endif /* USE_INITFINI_ARRAY */
>
>  #ifdef EH_FRAME_SECTION_NAME
>  /* Terminate the frame unwind info section with a 4byte 0 as a sentinel;
> diff --git a/gcc/output.h b/gcc/output.h
> index 7031b08..661b623 100644
> --- a/gcc/output.h
> +++ b/gcc/output.h
> @@ -655,6 +655,8 @@ extern void file_end_indicate_split_stack (void);
>
>  extern void default_elf_asm_output_external (FILE *file, tree,
>                                             const char *);
> +extern void default_elf_init_array_asm_out_constructor (rtx, int);
> +extern void default_elf_fini_array_asm_out_destructor (rtx, int);
>  extern int maybe_assemble_visibility (tree);
>
>  extern int default_address_cost (rtx, bool);
> diff --git a/gcc/varasm.c b/gcc/varasm.c
> index 40a8567..d15c278 100644
> --- a/gcc/varasm.c
> +++ b/gcc/varasm.c
> @@ -7397,4 +7397,62 @@ make_debug_expr_from_rtl (const_rtx exp)
>   return dval;
>  }
>
> +static GTY(()) section *elf_init_array_section;
> +static GTY(()) section *elf_fini_array_section;
> +
> +static section *
> +get_elf_initfini_array_priority_section (int priority,
> +                                        bool constructor_p)
> +{
> +  section *sec;
> +  if (priority != DEFAULT_INIT_PRIORITY)
> +    {
> +      char buf[18];
> +      sprintf (buf, "%s.%.5u",
> +              constructor_p ? ".init_array" : ".fini_array",
> +              priority);
> +      sec = get_section (buf, SECTION_WRITE, NULL_TREE);
> +    }
> +  else
> +    {
> +      if (constructor_p)
> +       {
> +         if (elf_init_array_section == NULL)
> +           elf_init_array_section
> +             = get_unnamed_section (0, output_section_asm_op,
> +                                    "\t.section\t.init_array");
> +         sec = elf_init_array_section;
> +       }
> +      else
> +       {
> +         if (elf_fini_array_section == NULL)
> +           elf_fini_array_section
> +             = get_unnamed_section (0, output_section_asm_op,
> +                                    "\t.section\t.fini_array");
> +         sec = elf_fini_array_section;
> +       }
> +    }
> +  return sec;
> +}
> +
> +/* Use .init_array section for constructors. */
> +
> +void
> +default_elf_init_array_asm_out_constructor (rtx symbol, int priority)
> +{
> +  section *sec = get_elf_initfini_array_priority_section (priority,
> +                                                         true);
> +  assemble_addr_to_section (symbol, sec);
> +}
> +
> +/* Use .fini_array section for destructors. */
> +
> +void
> +default_elf_fini_array_asm_out_destructor (rtx symbol, int priority)
> +{
> +  section *sec = get_elf_initfini_array_priority_section (priority,
> +                                                         false);
> +  assemble_addr_to_section (symbol, sec);
> +}
> +
>  #include "gt-varasm.h"
> --
> 1.7.6.5
>
Jakub Jelinek - Feb. 18, 2012, 9:54 a.m.
On Fri, Feb 17, 2012 at 05:20:02PM -0800, H.J. Lu wrote:
> This patch backports the fix from trunk:
> 
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46770
> 
> for google/gcc-4_6_2-mobile branch.  This is needed to support C++
> global constructors/destructiors on Android/x86.  OK for
> google/gcc-4_6_2-mobile branch?

Don't you want to backport also all the follow-ups on this?

	Jakub
Ollie Wild - Feb. 20, 2012, 2:03 a.m.
Hey, Jing, you broke the google/gcc-4_6 branch by checking the new
header file into the wrong directory.

Fixed via r184386.

Ollie

On Fri, Feb 17, 2012 at 10:25 PM, Jing Yu <jingyu@google.com> wrote:
>
> OK. Thanks for porting the patch.
> I will commit the patch into google/gcc-4_6_2-mobile for you.
>
> I would also like to commit it into google/gcc-4_6 branch if all tests
> pass. This patch is almost the same as Google Ref 47894.
>
> Thanks,
> Jing
>
> On Fri, Feb 17, 2012 at 5:20 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
> > Hi,
> >
> > This patch backports the fix from trunk:
> >
> > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46770
> >
> > for google/gcc-4_6_2-mobile branch.  This is needed to support C++
> > global constructors/destructiors on Android/x86.  OK for
> > google/gcc-4_6_2-mobile branch?
> >
> > Thanks.
> >
> > H.J.
> > ---
> > 2011-08-20  H.J. Lu  <hongjiu.lu@intel.com>
> >
> >        PR other/46770
> >        * config.gcc (tm_file): Add initfini-array.h if
> >        .init_arrary/.fini_array are supported.
> >
> >        * crtstuff.c: Don't generate .ctors nor .dtors sections if
> >        USE_INITFINI_ARRAY is defined.
> >
> >        * output.h (default_elf_init_array_asm_out_constructor): New.
> >        (default_elf_fini_array_asm_out_destructor): Likewise.
> >        * varasm.c (elf_init_array_section): Likewise.
> >        (elf_fini_array_section): Likewise.
> >        (get_elf_initfini_array_priority_section): Likewise.
> >        (default_elf_init_array_asm_out_constructor): Likewise.
> >        (default_elf_fini_array_asm_out_destructor): Likewise.
> >
> >        * config/initfini-array.h: New.
> >
> > git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@177933 138bc75d-0d04-0410-961f-82ee72b054a4
> >
> > Conflicts:
> >
> >        gcc/ChangeLog
> > ---
> >  gcc/ChangeLog.hjl           |   21 +++++++++++++++
> >  gcc/config.gcc              |    5 +++
> >  gcc/config/initfini-array.h |   37 +++++++++++++++++++++++++++
> >  gcc/crtstuff.c              |   11 +++++++-
> >  gcc/output.h                |    2 +
> >  gcc/varasm.c                |   58 +++++++++++++++++++++++++++++++++++++++++++
> >  6 files changed, 133 insertions(+), 1 deletions(-)
> >  create mode 100644 gcc/ChangeLog.hjl
> >  create mode 100644 gcc/config/initfini-array.h
> >
> > diff --git a/gcc/ChangeLog.hjl b/gcc/ChangeLog.hjl
> > new file mode 100644
> > index 0000000..3527b27
> > --- /dev/null
> > +++ b/gcc/ChangeLog.hjl
> > @@ -0,0 +1,21 @@
> > +2011-12-07  H.J. Lu  <hongjiu.lu@intel.com>
> > +
> > +       Backport from mainline
> > +       2011-08-20  H.J. Lu  <hongjiu.lu@intel.com>
> > +
> > +       PR other/46770
> > +       * config.gcc (tm_file): Add initfini-array.h if
> > +       .init_arrary/.fini_array are supported.
> > +
> > +       * crtstuff.c: Don't generate .ctors nor .dtors sections if
> > +       USE_INITFINI_ARRAY is defined.
> > +
> > +       * output.h (default_elf_init_array_asm_out_constructor): New.
> > +       (default_elf_fini_array_asm_out_destructor): Likewise.
> > +       * varasm.c (elf_init_array_section): Likewise.
> > +       (elf_fini_array_section): Likewise.
> > +       (get_elf_initfini_array_priority_section): Likewise.
> > +       (default_elf_init_array_asm_out_constructor): Likewise.
> > +       (default_elf_fini_array_asm_out_destructor): Likewise.
> > +
> > +       * config/initfini-array.h: New.
> > diff --git a/gcc/config.gcc b/gcc/config.gcc
> > index d9ac0fa..b386424 100644
> > --- a/gcc/config.gcc
> > +++ b/gcc/config.gcc
> > @@ -3176,6 +3176,11 @@ if test x$with_schedule = x; then
> >        esac
> >  fi
> >
> > +# Support --enable-initfini-array.
> > +if test x$enable_initfini_array = xyes; then
> > +  tm_file="${tm_file} initfini-array.h"
> > +fi
> > +
> >  # Validate and mark as valid any --with options supported
> >  # by this target.  In order to use a particular --with option
> >  # you must list it in supported_defaults; validating the value
> > diff --git a/gcc/config/initfini-array.h b/gcc/config/initfini-array.h
> > new file mode 100644
> > index 0000000..8aaadf6
> > --- /dev/null
> > +++ b/gcc/config/initfini-array.h
> > @@ -0,0 +1,37 @@
> > +/* Definitions for ELF systems with .init_array/.fini_array section
> > +   support.
> > +   Copyright (C) 2011
> > +   Free Software Foundation, Inc.
> > +
> > +   This file is part of GCC.
> > +
> > +   GCC is free software; you can redistribute it and/or modify it
> > +   under the terms of the GNU General Public License as published
> > +   by the Free Software Foundation; either version 3, or (at your
> > +   option) any later version.
> > +
> > +   GCC is distributed in the hope that it will be useful, but WITHOUT
> > +   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
> > +   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
> > +   License for more details.
> > +
> > +   You should have received a copy of the GNU General Public License
> > +   along with GCC; see the file COPYING3.  If not see
> > +   <http://www.gnu.org/licenses/>.  */
> > +
> > +#define USE_INITFINI_ARRAY
> > +
> > +#undef INIT_SECTION_ASM_OP
> > +#undef FINI_SECTION_ASM_OP
> > +
> > +#undef INIT_ARRAY_SECTION_ASM_OP
> > +#define INIT_ARRAY_SECTION_ASM_OP
> > +
> > +#undef FINI_ARRAY_SECTION_ASM_OP
> > +#define FINI_ARRAY_SECTION_ASM_OP
> > +
> > +/* Use .init_array/.fini_array section for constructors and destructors. */
> > +#undef TARGET_ASM_CONSTRUCTOR
> > +#define TARGET_ASM_CONSTRUCTOR default_elf_init_array_asm_out_constructor
> > +#undef TARGET_ASM_DESTRUCTOR
> > +#define TARGET_ASM_DESTRUCTOR default_elf_fini_array_asm_out_destructor
> > diff --git a/gcc/crtstuff.c b/gcc/crtstuff.c
> > index b65f490..010d472 100644
> > --- a/gcc/crtstuff.c
> > +++ b/gcc/crtstuff.c
> > @@ -1,7 +1,8 @@
> >  /* Specialized bits of code needed to support construction and
> >    destruction of file-scope objects in C++ code.
> >    Copyright (C) 1991, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
> > -   2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
> > +   2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011
> > +   Free Software Foundation, Inc.
> >    Contributed by Ron Guilmette (rfg@monkeys.com).
> >
> >  This file is part of GCC.
> > @@ -189,6 +190,9 @@ typedef void (*func_ptr) (void);
> >    refer to only the __CTOR_END__ symbol in crtend.o and the __DTOR_LIST__
> >    symbol in crtbegin.o, where they are defined.  */
> >
> > +/* No need for .ctors/.dtors section if linker can place them in
> > +   .init_array/.fini_array section.  */
> > +#ifndef USE_INITFINI_ARRAY
> >  /* The -1 is a flag to __do_global_[cd]tors indicating that this table
> >    does not start with a count of elements.  */
> >  #ifdef CTOR_LIST_BEGIN
> > @@ -219,6 +223,7 @@ STATIC func_ptr __DTOR_LIST__[1]
> >   __attribute__((section(".dtors"), aligned(sizeof(func_ptr))))
> >   = { (func_ptr) (-1) };
> >  #endif /* __DTOR_LIST__ alternatives */
> > +#endif /* USE_INITFINI_ARRAY */
> >
> >  #ifdef USE_EH_FRAME_REGISTRY
> >  /* Stick a label at the beginning of the frame unwind info so we can register
> > @@ -489,6 +494,9 @@ __do_global_ctors_1(void)
> >
> >  #elif defined(CRT_END) /* ! CRT_BEGIN */
> >
> > +/* No need for .ctors/.dtors section if linker can place them in
> > +   .init_array/.fini_array section.  */
> > +#ifndef USE_INITFINI_ARRAY
> >  /* Put a word containing zero at the end of each of our two lists of function
> >    addresses.  Note that the words defined here go into the .ctors and .dtors
> >    sections of the crtend.o file, and since that file is always linked in
> > @@ -534,6 +542,7 @@ STATIC func_ptr __DTOR_END__[1]
> >   __attribute__((used, section(".dtors"), aligned(sizeof(func_ptr))))
> >   = { (func_ptr) 0 };
> >  #endif
> > +#endif /* USE_INITFINI_ARRAY */
> >
> >  #ifdef EH_FRAME_SECTION_NAME
> >  /* Terminate the frame unwind info section with a 4byte 0 as a sentinel;
> > diff --git a/gcc/output.h b/gcc/output.h
> > index 7031b08..661b623 100644
> > --- a/gcc/output.h
> > +++ b/gcc/output.h
> > @@ -655,6 +655,8 @@ extern void file_end_indicate_split_stack (void);
> >
> >  extern void default_elf_asm_output_external (FILE *file, tree,
> >                                             const char *);
> > +extern void default_elf_init_array_asm_out_constructor (rtx, int);
> > +extern void default_elf_fini_array_asm_out_destructor (rtx, int);
> >  extern int maybe_assemble_visibility (tree);
> >
> >  extern int default_address_cost (rtx, bool);
> > diff --git a/gcc/varasm.c b/gcc/varasm.c
> > index 40a8567..d15c278 100644
> > --- a/gcc/varasm.c
> > +++ b/gcc/varasm.c
> > @@ -7397,4 +7397,62 @@ make_debug_expr_from_rtl (const_rtx exp)
> >   return dval;
> >  }
> >
> > +static GTY(()) section *elf_init_array_section;
> > +static GTY(()) section *elf_fini_array_section;
> > +
> > +static section *
> > +get_elf_initfini_array_priority_section (int priority,
> > +                                        bool constructor_p)
> > +{
> > +  section *sec;
> > +  if (priority != DEFAULT_INIT_PRIORITY)
> > +    {
> > +      char buf[18];
> > +      sprintf (buf, "%s.%.5u",
> > +              constructor_p ? ".init_array" : ".fini_array",
> > +              priority);
> > +      sec = get_section (buf, SECTION_WRITE, NULL_TREE);
> > +    }
> > +  else
> > +    {
> > +      if (constructor_p)
> > +       {
> > +         if (elf_init_array_section == NULL)
> > +           elf_init_array_section
> > +             = get_unnamed_section (0, output_section_asm_op,
> > +                                    "\t.section\t.init_array");
> > +         sec = elf_init_array_section;
> > +       }
> > +      else
> > +       {
> > +         if (elf_fini_array_section == NULL)
> > +           elf_fini_array_section
> > +             = get_unnamed_section (0, output_section_asm_op,
> > +                                    "\t.section\t.fini_array");
> > +         sec = elf_fini_array_section;
> > +       }
> > +    }
> > +  return sec;
> > +}
> > +
> > +/* Use .init_array section for constructors. */
> > +
> > +void
> > +default_elf_init_array_asm_out_constructor (rtx symbol, int priority)
> > +{
> > +  section *sec = get_elf_initfini_array_priority_section (priority,
> > +                                                         true);
> > +  assemble_addr_to_section (symbol, sec);
> > +}
> > +
> > +/* Use .fini_array section for destructors. */
> > +
> > +void
> > +default_elf_fini_array_asm_out_destructor (rtx symbol, int priority)
> > +{
> > +  section *sec = get_elf_initfini_array_priority_section (priority,
> > +                                                         false);
> > +  assemble_addr_to_section (symbol, sec);
> > +}
> > +
> >  #include "gt-varasm.h"
> > --
> > 1.7.6.5
> >
Ilya Enkovich - Feb. 20, 2012, 3:15 p.m.
Hello,

> Hey, Jing, you broke the google/gcc-4_6 branch by checking the new
> header file into the wrong directory.
>
> Fixed via r184386.
>

google/gcc-4_6_2-mobile branch still has the same problem. Could
please someone fix it?

Thanks
Ilya

> Ollie
>
> On Fri, Feb 17, 2012 at 10:25 PM, Jing Yu <jingyu@google.com> wrote:
>>
>> OK. Thanks for porting the patch.
>> I will commit the patch into google/gcc-4_6_2-mobile for you.
>>
>> I would also like to commit it into google/gcc-4_6 branch if all tests
>> pass. This patch is almost the same as Google Ref 47894.
>>
>> Thanks,
>> Jing
>>
>> On Fri, Feb 17, 2012 at 5:20 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
>> > Hi,
>> >
>> > This patch backports the fix from trunk:
>> >
>> > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46770
>> >
>> > for google/gcc-4_6_2-mobile branch.  This is needed to support C++
>> > global constructors/destructiors on Android/x86.  OK for
>> > google/gcc-4_6_2-mobile branch?
>> >
>> > Thanks.
>> >
>> > H.J.
>> > ---
>> > 2011-08-20  H.J. Lu  <hongjiu.lu@intel.com>
>> >
>> >        PR other/46770
>> >        * config.gcc (tm_file): Add initfini-array.h if
>> >        .init_arrary/.fini_array are supported.
>> >
>> >        * crtstuff.c: Don't generate .ctors nor .dtors sections if
>> >        USE_INITFINI_ARRAY is defined.
>> >
>> >        * output.h (default_elf_init_array_asm_out_constructor): New.
>> >        (default_elf_fini_array_asm_out_destructor): Likewise.
>> >        * varasm.c (elf_init_array_section): Likewise.
>> >        (elf_fini_array_section): Likewise.
>> >        (get_elf_initfini_array_priority_section): Likewise.
>> >        (default_elf_init_array_asm_out_constructor): Likewise.
>> >        (default_elf_fini_array_asm_out_destructor): Likewise.
>> >
>> >        * config/initfini-array.h: New.
>> >
>> > git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@177933 138bc75d-0d04-0410-961f-82ee72b054a4
>> >
>> > Conflicts:
>> >
>> >        gcc/ChangeLog
>> > ---
>> >  gcc/ChangeLog.hjl           |   21 +++++++++++++++
>> >  gcc/config.gcc              |    5 +++
>> >  gcc/config/initfini-array.h |   37 +++++++++++++++++++++++++++
>> >  gcc/crtstuff.c              |   11 +++++++-
>> >  gcc/output.h                |    2 +
>> >  gcc/varasm.c                |   58 +++++++++++++++++++++++++++++++++++++++++++
>> >  6 files changed, 133 insertions(+), 1 deletions(-)
>> >  create mode 100644 gcc/ChangeLog.hjl
>> >  create mode 100644 gcc/config/initfini-array.h
>> >
>> > diff --git a/gcc/ChangeLog.hjl b/gcc/ChangeLog.hjl
>> > new file mode 100644
>> > index 0000000..3527b27
>> > --- /dev/null
>> > +++ b/gcc/ChangeLog.hjl
>> > @@ -0,0 +1,21 @@
>> > +2011-12-07  H.J. Lu  <hongjiu.lu@intel.com>
>> > +
>> > +       Backport from mainline
>> > +       2011-08-20  H.J. Lu  <hongjiu.lu@intel.com>
>> > +
>> > +       PR other/46770
>> > +       * config.gcc (tm_file): Add initfini-array.h if
>> > +       .init_arrary/.fini_array are supported.
>> > +
>> > +       * crtstuff.c: Don't generate .ctors nor .dtors sections if
>> > +       USE_INITFINI_ARRAY is defined.
>> > +
>> > +       * output.h (default_elf_init_array_asm_out_constructor): New.
>> > +       (default_elf_fini_array_asm_out_destructor): Likewise.
>> > +       * varasm.c (elf_init_array_section): Likewise.
>> > +       (elf_fini_array_section): Likewise.
>> > +       (get_elf_initfini_array_priority_section): Likewise.
>> > +       (default_elf_init_array_asm_out_constructor): Likewise.
>> > +       (default_elf_fini_array_asm_out_destructor): Likewise.
>> > +
>> > +       * config/initfini-array.h: New.
>> > diff --git a/gcc/config.gcc b/gcc/config.gcc
>> > index d9ac0fa..b386424 100644
>> > --- a/gcc/config.gcc
>> > +++ b/gcc/config.gcc
>> > @@ -3176,6 +3176,11 @@ if test x$with_schedule = x; then
>> >        esac
>> >  fi
>> >
>> > +# Support --enable-initfini-array.
>> > +if test x$enable_initfini_array = xyes; then
>> > +  tm_file="${tm_file} initfini-array.h"
>> > +fi
>> > +
>> >  # Validate and mark as valid any --with options supported
>> >  # by this target.  In order to use a particular --with option
>> >  # you must list it in supported_defaults; validating the value
>> > diff --git a/gcc/config/initfini-array.h b/gcc/config/initfini-array.h
>> > new file mode 100644
>> > index 0000000..8aaadf6
>> > --- /dev/null
>> > +++ b/gcc/config/initfini-array.h
>> > @@ -0,0 +1,37 @@
>> > +/* Definitions for ELF systems with .init_array/.fini_array section
>> > +   support.
>> > +   Copyright (C) 2011
>> > +   Free Software Foundation, Inc.
>> > +
>> > +   This file is part of GCC.
>> > +
>> > +   GCC is free software; you can redistribute it and/or modify it
>> > +   under the terms of the GNU General Public License as published
>> > +   by the Free Software Foundation; either version 3, or (at your
>> > +   option) any later version.
>> > +
>> > +   GCC is distributed in the hope that it will be useful, but WITHOUT
>> > +   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
>> > +   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
>> > +   License for more details.
>> > +
>> > +   You should have received a copy of the GNU General Public License
>> > +   along with GCC; see the file COPYING3.  If not see
>> > +   <http://www.gnu.org/licenses/>.  */
>> > +
>> > +#define USE_INITFINI_ARRAY
>> > +
>> > +#undef INIT_SECTION_ASM_OP
>> > +#undef FINI_SECTION_ASM_OP
>> > +
>> > +#undef INIT_ARRAY_SECTION_ASM_OP
>> > +#define INIT_ARRAY_SECTION_ASM_OP
>> > +
>> > +#undef FINI_ARRAY_SECTION_ASM_OP
>> > +#define FINI_ARRAY_SECTION_ASM_OP
>> > +
>> > +/* Use .init_array/.fini_array section for constructors and destructors. */
>> > +#undef TARGET_ASM_CONSTRUCTOR
>> > +#define TARGET_ASM_CONSTRUCTOR default_elf_init_array_asm_out_constructor
>> > +#undef TARGET_ASM_DESTRUCTOR
>> > +#define TARGET_ASM_DESTRUCTOR default_elf_fini_array_asm_out_destructor
>> > diff --git a/gcc/crtstuff.c b/gcc/crtstuff.c
>> > index b65f490..010d472 100644
>> > --- a/gcc/crtstuff.c
>> > +++ b/gcc/crtstuff.c
>> > @@ -1,7 +1,8 @@
>> >  /* Specialized bits of code needed to support construction and
>> >    destruction of file-scope objects in C++ code.
>> >    Copyright (C) 1991, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
>> > -   2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
>> > +   2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011
>> > +   Free Software Foundation, Inc.
>> >    Contributed by Ron Guilmette (rfg@monkeys.com).
>> >
>> >  This file is part of GCC.
>> > @@ -189,6 +190,9 @@ typedef void (*func_ptr) (void);
>> >    refer to only the __CTOR_END__ symbol in crtend.o and the __DTOR_LIST__
>> >    symbol in crtbegin.o, where they are defined.  */
>> >
>> > +/* No need for .ctors/.dtors section if linker can place them in
>> > +   .init_array/.fini_array section.  */
>> > +#ifndef USE_INITFINI_ARRAY
>> >  /* The -1 is a flag to __do_global_[cd]tors indicating that this table
>> >    does not start with a count of elements.  */
>> >  #ifdef CTOR_LIST_BEGIN
>> > @@ -219,6 +223,7 @@ STATIC func_ptr __DTOR_LIST__[1]
>> >   __attribute__((section(".dtors"), aligned(sizeof(func_ptr))))
>> >   = { (func_ptr) (-1) };
>> >  #endif /* __DTOR_LIST__ alternatives */
>> > +#endif /* USE_INITFINI_ARRAY */
>> >
>> >  #ifdef USE_EH_FRAME_REGISTRY
>> >  /* Stick a label at the beginning of the frame unwind info so we can register
>> > @@ -489,6 +494,9 @@ __do_global_ctors_1(void)
>> >
>> >  #elif defined(CRT_END) /* ! CRT_BEGIN */
>> >
>> > +/* No need for .ctors/.dtors section if linker can place them in
>> > +   .init_array/.fini_array section.  */
>> > +#ifndef USE_INITFINI_ARRAY
>> >  /* Put a word containing zero at the end of each of our two lists of function
>> >    addresses.  Note that the words defined here go into the .ctors and .dtors
>> >    sections of the crtend.o file, and since that file is always linked in
>> > @@ -534,6 +542,7 @@ STATIC func_ptr __DTOR_END__[1]
>> >   __attribute__((used, section(".dtors"), aligned(sizeof(func_ptr))))
>> >   = { (func_ptr) 0 };
>> >  #endif
>> > +#endif /* USE_INITFINI_ARRAY */
>> >
>> >  #ifdef EH_FRAME_SECTION_NAME
>> >  /* Terminate the frame unwind info section with a 4byte 0 as a sentinel;
>> > diff --git a/gcc/output.h b/gcc/output.h
>> > index 7031b08..661b623 100644
>> > --- a/gcc/output.h
>> > +++ b/gcc/output.h
>> > @@ -655,6 +655,8 @@ extern void file_end_indicate_split_stack (void);
>> >
>> >  extern void default_elf_asm_output_external (FILE *file, tree,
>> >                                             const char *);
>> > +extern void default_elf_init_array_asm_out_constructor (rtx, int);
>> > +extern void default_elf_fini_array_asm_out_destructor (rtx, int);
>> >  extern int maybe_assemble_visibility (tree);
>> >
>> >  extern int default_address_cost (rtx, bool);
>> > diff --git a/gcc/varasm.c b/gcc/varasm.c
>> > index 40a8567..d15c278 100644
>> > --- a/gcc/varasm.c
>> > +++ b/gcc/varasm.c
>> > @@ -7397,4 +7397,62 @@ make_debug_expr_from_rtl (const_rtx exp)
>> >   return dval;
>> >  }
>> >
>> > +static GTY(()) section *elf_init_array_section;
>> > +static GTY(()) section *elf_fini_array_section;
>> > +
>> > +static section *
>> > +get_elf_initfini_array_priority_section (int priority,
>> > +                                        bool constructor_p)
>> > +{
>> > +  section *sec;
>> > +  if (priority != DEFAULT_INIT_PRIORITY)
>> > +    {
>> > +      char buf[18];
>> > +      sprintf (buf, "%s.%.5u",
>> > +              constructor_p ? ".init_array" : ".fini_array",
>> > +              priority);
>> > +      sec = get_section (buf, SECTION_WRITE, NULL_TREE);
>> > +    }
>> > +  else
>> > +    {
>> > +      if (constructor_p)
>> > +       {
>> > +         if (elf_init_array_section == NULL)
>> > +           elf_init_array_section
>> > +             = get_unnamed_section (0, output_section_asm_op,
>> > +                                    "\t.section\t.init_array");
>> > +         sec = elf_init_array_section;
>> > +       }
>> > +      else
>> > +       {
>> > +         if (elf_fini_array_section == NULL)
>> > +           elf_fini_array_section
>> > +             = get_unnamed_section (0, output_section_asm_op,
>> > +                                    "\t.section\t.fini_array");
>> > +         sec = elf_fini_array_section;
>> > +       }
>> > +    }
>> > +  return sec;
>> > +}
>> > +
>> > +/* Use .init_array section for constructors. */
>> > +
>> > +void
>> > +default_elf_init_array_asm_out_constructor (rtx symbol, int priority)
>> > +{
>> > +  section *sec = get_elf_initfini_array_priority_section (priority,
>> > +                                                         true);
>> > +  assemble_addr_to_section (symbol, sec);
>> > +}
>> > +
>> > +/* Use .fini_array section for destructors. */
>> > +
>> > +void
>> > +default_elf_fini_array_asm_out_destructor (rtx symbol, int priority)
>> > +{
>> > +  section *sec = get_elf_initfini_array_priority_section (priority,
>> > +                                                         false);
>> > +  assemble_addr_to_section (symbol, sec);
>> > +}
>> > +
>> >  #include "gt-varasm.h"
>> > --
>> > 1.7.6.5
>> >
H.J. Lu - Feb. 20, 2012, 4:30 p.m.
On Sat, Feb 18, 2012 at 1:54 AM, Jakub Jelinek <jakub@redhat.com> wrote:
> On Fri, Feb 17, 2012 at 05:20:02PM -0800, H.J. Lu wrote:
>> This patch backports the fix from trunk:
>>
>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46770
>>
>> for google/gcc-4_6_2-mobile branch.  This is needed to support C++
>> global constructors/destructiors on Android/x86.  OK for
>> google/gcc-4_6_2-mobile branch?
>
> Don't you want to backport also all the follow-ups on this?
>

The original patch works with cross compile since it is disabled by
default.  For native compile, it works with the default GNU assembler
and linker.  If there are additional failure for native compile, it should
be disabled at configure time.
Jing Yu - Feb. 20, 2012, 11:14 p.m.
Sorry -- I will fix it in google/gcc-4_6_2-mobile.

Thanks,
Jing

On Mon, Feb 20, 2012 at 7:15 AM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
> Hello,
>
>> Hey, Jing, you broke the google/gcc-4_6 branch by checking the new
>> header file into the wrong directory.
>>
>> Fixed via r184386.
>>
>
> google/gcc-4_6_2-mobile branch still has the same problem. Could
> please someone fix it?
>
> Thanks
> Ilya
>
>> Ollie
>>
>> On Fri, Feb 17, 2012 at 10:25 PM, Jing Yu <jingyu@google.com> wrote:
>>>
>>> OK. Thanks for porting the patch.
>>> I will commit the patch into google/gcc-4_6_2-mobile for you.
>>>
>>> I would also like to commit it into google/gcc-4_6 branch if all tests
>>> pass. This patch is almost the same as Google Ref 47894.
>>>
>>> Thanks,
>>> Jing
>>>
>>> On Fri, Feb 17, 2012 at 5:20 PM, H.J. Lu <hongjiu.lu@intel.com> wrote:
>>> > Hi,
>>> >
>>> > This patch backports the fix from trunk:
>>> >
>>> > http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46770
>>> >
>>> > for google/gcc-4_6_2-mobile branch.  This is needed to support C++
>>> > global constructors/destructiors on Android/x86.  OK for
>>> > google/gcc-4_6_2-mobile branch?
>>> >
>>> > Thanks.
>>> >
>>> > H.J.
>>> > ---
>>> > 2011-08-20  H.J. Lu  <hongjiu.lu@intel.com>
>>> >
>>> >        PR other/46770
>>> >        * config.gcc (tm_file): Add initfini-array.h if
>>> >        .init_arrary/.fini_array are supported.
>>> >
>>> >        * crtstuff.c: Don't generate .ctors nor .dtors sections if
>>> >        USE_INITFINI_ARRAY is defined.
>>> >
>>> >        * output.h (default_elf_init_array_asm_out_constructor): New.
>>> >        (default_elf_fini_array_asm_out_destructor): Likewise.
>>> >        * varasm.c (elf_init_array_section): Likewise.
>>> >        (elf_fini_array_section): Likewise.
>>> >        (get_elf_initfini_array_priority_section): Likewise.
>>> >        (default_elf_init_array_asm_out_constructor): Likewise.
>>> >        (default_elf_fini_array_asm_out_destructor): Likewise.
>>> >
>>> >        * config/initfini-array.h: New.
>>> >
>>> > git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@177933 138bc75d-0d04-0410-961f-82ee72b054a4
>>> >
>>> > Conflicts:
>>> >
>>> >        gcc/ChangeLog
>>> > ---
>>> >  gcc/ChangeLog.hjl           |   21 +++++++++++++++
>>> >  gcc/config.gcc              |    5 +++
>>> >  gcc/config/initfini-array.h |   37 +++++++++++++++++++++++++++
>>> >  gcc/crtstuff.c              |   11 +++++++-
>>> >  gcc/output.h                |    2 +
>>> >  gcc/varasm.c                |   58 +++++++++++++++++++++++++++++++++++++++++++
>>> >  6 files changed, 133 insertions(+), 1 deletions(-)
>>> >  create mode 100644 gcc/ChangeLog.hjl
>>> >  create mode 100644 gcc/config/initfini-array.h
>>> >
>>> > diff --git a/gcc/ChangeLog.hjl b/gcc/ChangeLog.hjl
>>> > new file mode 100644
>>> > index 0000000..3527b27
>>> > --- /dev/null
>>> > +++ b/gcc/ChangeLog.hjl
>>> > @@ -0,0 +1,21 @@
>>> > +2011-12-07  H.J. Lu  <hongjiu.lu@intel.com>
>>> > +
>>> > +       Backport from mainline
>>> > +       2011-08-20  H.J. Lu  <hongjiu.lu@intel.com>
>>> > +
>>> > +       PR other/46770
>>> > +       * config.gcc (tm_file): Add initfini-array.h if
>>> > +       .init_arrary/.fini_array are supported.
>>> > +
>>> > +       * crtstuff.c: Don't generate .ctors nor .dtors sections if
>>> > +       USE_INITFINI_ARRAY is defined.
>>> > +
>>> > +       * output.h (default_elf_init_array_asm_out_constructor): New.
>>> > +       (default_elf_fini_array_asm_out_destructor): Likewise.
>>> > +       * varasm.c (elf_init_array_section): Likewise.
>>> > +       (elf_fini_array_section): Likewise.
>>> > +       (get_elf_initfini_array_priority_section): Likewise.
>>> > +       (default_elf_init_array_asm_out_constructor): Likewise.
>>> > +       (default_elf_fini_array_asm_out_destructor): Likewise.
>>> > +
>>> > +       * config/initfini-array.h: New.
>>> > diff --git a/gcc/config.gcc b/gcc/config.gcc
>>> > index d9ac0fa..b386424 100644
>>> > --- a/gcc/config.gcc
>>> > +++ b/gcc/config.gcc
>>> > @@ -3176,6 +3176,11 @@ if test x$with_schedule = x; then
>>> >        esac
>>> >  fi
>>> >
>>> > +# Support --enable-initfini-array.
>>> > +if test x$enable_initfini_array = xyes; then
>>> > +  tm_file="${tm_file} initfini-array.h"
>>> > +fi
>>> > +
>>> >  # Validate and mark as valid any --with options supported
>>> >  # by this target.  In order to use a particular --with option
>>> >  # you must list it in supported_defaults; validating the value
>>> > diff --git a/gcc/config/initfini-array.h b/gcc/config/initfini-array.h
>>> > new file mode 100644
>>> > index 0000000..8aaadf6
>>> > --- /dev/null
>>> > +++ b/gcc/config/initfini-array.h
>>> > @@ -0,0 +1,37 @@
>>> > +/* Definitions for ELF systems with .init_array/.fini_array section
>>> > +   support.
>>> > +   Copyright (C) 2011
>>> > +   Free Software Foundation, Inc.
>>> > +
>>> > +   This file is part of GCC.
>>> > +
>>> > +   GCC is free software; you can redistribute it and/or modify it
>>> > +   under the terms of the GNU General Public License as published
>>> > +   by the Free Software Foundation; either version 3, or (at your
>>> > +   option) any later version.
>>> > +
>>> > +   GCC is distributed in the hope that it will be useful, but WITHOUT
>>> > +   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
>>> > +   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
>>> > +   License for more details.
>>> > +
>>> > +   You should have received a copy of the GNU General Public License
>>> > +   along with GCC; see the file COPYING3.  If not see
>>> > +   <http://www.gnu.org/licenses/>.  */
>>> > +
>>> > +#define USE_INITFINI_ARRAY
>>> > +
>>> > +#undef INIT_SECTION_ASM_OP
>>> > +#undef FINI_SECTION_ASM_OP
>>> > +
>>> > +#undef INIT_ARRAY_SECTION_ASM_OP
>>> > +#define INIT_ARRAY_SECTION_ASM_OP
>>> > +
>>> > +#undef FINI_ARRAY_SECTION_ASM_OP
>>> > +#define FINI_ARRAY_SECTION_ASM_OP
>>> > +
>>> > +/* Use .init_array/.fini_array section for constructors and destructors. */
>>> > +#undef TARGET_ASM_CONSTRUCTOR
>>> > +#define TARGET_ASM_CONSTRUCTOR default_elf_init_array_asm_out_constructor
>>> > +#undef TARGET_ASM_DESTRUCTOR
>>> > +#define TARGET_ASM_DESTRUCTOR default_elf_fini_array_asm_out_destructor
>>> > diff --git a/gcc/crtstuff.c b/gcc/crtstuff.c
>>> > index b65f490..010d472 100644
>>> > --- a/gcc/crtstuff.c
>>> > +++ b/gcc/crtstuff.c
>>> > @@ -1,7 +1,8 @@
>>> >  /* Specialized bits of code needed to support construction and
>>> >    destruction of file-scope objects in C++ code.
>>> >    Copyright (C) 1991, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
>>> > -   2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
>>> > +   2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011
>>> > +   Free Software Foundation, Inc.
>>> >    Contributed by Ron Guilmette (rfg@monkeys.com).
>>> >
>>> >  This file is part of GCC.
>>> > @@ -189,6 +190,9 @@ typedef void (*func_ptr) (void);
>>> >    refer to only the __CTOR_END__ symbol in crtend.o and the __DTOR_LIST__
>>> >    symbol in crtbegin.o, where they are defined.  */
>>> >
>>> > +/* No need for .ctors/.dtors section if linker can place them in
>>> > +   .init_array/.fini_array section.  */
>>> > +#ifndef USE_INITFINI_ARRAY
>>> >  /* The -1 is a flag to __do_global_[cd]tors indicating that this table
>>> >    does not start with a count of elements.  */
>>> >  #ifdef CTOR_LIST_BEGIN
>>> > @@ -219,6 +223,7 @@ STATIC func_ptr __DTOR_LIST__[1]
>>> >   __attribute__((section(".dtors"), aligned(sizeof(func_ptr))))
>>> >   = { (func_ptr) (-1) };
>>> >  #endif /* __DTOR_LIST__ alternatives */
>>> > +#endif /* USE_INITFINI_ARRAY */
>>> >
>>> >  #ifdef USE_EH_FRAME_REGISTRY
>>> >  /* Stick a label at the beginning of the frame unwind info so we can register
>>> > @@ -489,6 +494,9 @@ __do_global_ctors_1(void)
>>> >
>>> >  #elif defined(CRT_END) /* ! CRT_BEGIN */
>>> >
>>> > +/* No need for .ctors/.dtors section if linker can place them in
>>> > +   .init_array/.fini_array section.  */
>>> > +#ifndef USE_INITFINI_ARRAY
>>> >  /* Put a word containing zero at the end of each of our two lists of function
>>> >    addresses.  Note that the words defined here go into the .ctors and .dtors
>>> >    sections of the crtend.o file, and since that file is always linked in
>>> > @@ -534,6 +542,7 @@ STATIC func_ptr __DTOR_END__[1]
>>> >   __attribute__((used, section(".dtors"), aligned(sizeof(func_ptr))))
>>> >   = { (func_ptr) 0 };
>>> >  #endif
>>> > +#endif /* USE_INITFINI_ARRAY */
>>> >
>>> >  #ifdef EH_FRAME_SECTION_NAME
>>> >  /* Terminate the frame unwind info section with a 4byte 0 as a sentinel;
>>> > diff --git a/gcc/output.h b/gcc/output.h
>>> > index 7031b08..661b623 100644
>>> > --- a/gcc/output.h
>>> > +++ b/gcc/output.h
>>> > @@ -655,6 +655,8 @@ extern void file_end_indicate_split_stack (void);
>>> >
>>> >  extern void default_elf_asm_output_external (FILE *file, tree,
>>> >                                             const char *);
>>> > +extern void default_elf_init_array_asm_out_constructor (rtx, int);
>>> > +extern void default_elf_fini_array_asm_out_destructor (rtx, int);
>>> >  extern int maybe_assemble_visibility (tree);
>>> >
>>> >  extern int default_address_cost (rtx, bool);
>>> > diff --git a/gcc/varasm.c b/gcc/varasm.c
>>> > index 40a8567..d15c278 100644
>>> > --- a/gcc/varasm.c
>>> > +++ b/gcc/varasm.c
>>> > @@ -7397,4 +7397,62 @@ make_debug_expr_from_rtl (const_rtx exp)
>>> >   return dval;
>>> >  }
>>> >
>>> > +static GTY(()) section *elf_init_array_section;
>>> > +static GTY(()) section *elf_fini_array_section;
>>> > +
>>> > +static section *
>>> > +get_elf_initfini_array_priority_section (int priority,
>>> > +                                        bool constructor_p)
>>> > +{
>>> > +  section *sec;
>>> > +  if (priority != DEFAULT_INIT_PRIORITY)
>>> > +    {
>>> > +      char buf[18];
>>> > +      sprintf (buf, "%s.%.5u",
>>> > +              constructor_p ? ".init_array" : ".fini_array",
>>> > +              priority);
>>> > +      sec = get_section (buf, SECTION_WRITE, NULL_TREE);
>>> > +    }
>>> > +  else
>>> > +    {
>>> > +      if (constructor_p)
>>> > +       {
>>> > +         if (elf_init_array_section == NULL)
>>> > +           elf_init_array_section
>>> > +             = get_unnamed_section (0, output_section_asm_op,
>>> > +                                    "\t.section\t.init_array");
>>> > +         sec = elf_init_array_section;
>>> > +       }
>>> > +      else
>>> > +       {
>>> > +         if (elf_fini_array_section == NULL)
>>> > +           elf_fini_array_section
>>> > +             = get_unnamed_section (0, output_section_asm_op,
>>> > +                                    "\t.section\t.fini_array");
>>> > +         sec = elf_fini_array_section;
>>> > +       }
>>> > +    }
>>> > +  return sec;
>>> > +}
>>> > +
>>> > +/* Use .init_array section for constructors. */
>>> > +
>>> > +void
>>> > +default_elf_init_array_asm_out_constructor (rtx symbol, int priority)
>>> > +{
>>> > +  section *sec = get_elf_initfini_array_priority_section (priority,
>>> > +                                                         true);
>>> > +  assemble_addr_to_section (symbol, sec);
>>> > +}
>>> > +
>>> > +/* Use .fini_array section for destructors. */
>>> > +
>>> > +void
>>> > +default_elf_fini_array_asm_out_destructor (rtx symbol, int priority)
>>> > +{
>>> > +  section *sec = get_elf_initfini_array_priority_section (priority,
>>> > +                                                         false);
>>> > +  assemble_addr_to_section (symbol, sec);
>>> > +}
>>> > +
>>> >  #include "gt-varasm.h"
>>> > --
>>> > 1.7.6.5
>>> >
Jing Yu - Feb. 21, 2012, 7:31 a.m.
Hi H.J.,

I think the patch itself is not enough.
I compared "AC_DEFUN([gcc_AC_INITFINI_ARRAY]" part (in acinclude.m4)
of gcc trunk and google/gcc-4_6_2-mobile, and found how
enable_initfini_array is
configured is different.

The patch breaks some of our tests. enable_initfini_array should be
disabled for cross compile by default. But it is not true in our
branch. Could you please point us all related patches?

Thanks,
Jing

On Mon, Feb 20, 2012 at 8:30 AM, H.J. Lu <hjl.tools@gmail.com> wrote:
> On Sat, Feb 18, 2012 at 1:54 AM, Jakub Jelinek <jakub@redhat.com> wrote:
>> On Fri, Feb 17, 2012 at 05:20:02PM -0800, H.J. Lu wrote:
>>> This patch backports the fix from trunk:
>>>
>>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=46770
>>>
>>> for google/gcc-4_6_2-mobile branch.  This is needed to support C++
>>> global constructors/destructiors on Android/x86.  OK for
>>> google/gcc-4_6_2-mobile branch?
>>
>> Don't you want to backport also all the follow-ups on this?
>>
>
> The original patch works with cross compile since it is disabled by
> default.  For native compile, it works with the default GNU assembler
> and linker.  If there are additional failure for native compile, it should
> be disabled at configure time.
>
>
> --
> H.J.

Patch

diff --git a/gcc/ChangeLog.hjl b/gcc/ChangeLog.hjl
new file mode 100644
index 0000000..3527b27
--- /dev/null
+++ b/gcc/ChangeLog.hjl
@@ -0,0 +1,21 @@ 
+2011-12-07  H.J. Lu  <hongjiu.lu@intel.com>
+
+	Backport from mainline
+	2011-08-20  H.J. Lu  <hongjiu.lu@intel.com>
+
+	PR other/46770
+	* config.gcc (tm_file): Add initfini-array.h if
+	.init_arrary/.fini_array are supported.
+
+	* crtstuff.c: Don't generate .ctors nor .dtors sections if
+	USE_INITFINI_ARRAY is defined.
+
+	* output.h (default_elf_init_array_asm_out_constructor): New.
+	(default_elf_fini_array_asm_out_destructor): Likewise.
+	* varasm.c (elf_init_array_section): Likewise.
+	(elf_fini_array_section): Likewise.
+	(get_elf_initfini_array_priority_section): Likewise.
+	(default_elf_init_array_asm_out_constructor): Likewise.
+	(default_elf_fini_array_asm_out_destructor): Likewise.
+
+	* config/initfini-array.h: New.
diff --git a/gcc/config.gcc b/gcc/config.gcc
index d9ac0fa..b386424 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -3176,6 +3176,11 @@  if test x$with_schedule = x; then
 	esac
 fi
 
+# Support --enable-initfini-array.
+if test x$enable_initfini_array = xyes; then
+  tm_file="${tm_file} initfini-array.h"
+fi
+
 # Validate and mark as valid any --with options supported
 # by this target.  In order to use a particular --with option
 # you must list it in supported_defaults; validating the value
diff --git a/gcc/config/initfini-array.h b/gcc/config/initfini-array.h
new file mode 100644
index 0000000..8aaadf6
--- /dev/null
+++ b/gcc/config/initfini-array.h
@@ -0,0 +1,37 @@ 
+/* Definitions for ELF systems with .init_array/.fini_array section
+   support.
+   Copyright (C) 2011
+   Free Software Foundation, Inc.
+
+   This file is part of GCC.
+
+   GCC is free software; you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published
+   by the Free Software Foundation; either version 3, or (at your
+   option) any later version.
+
+   GCC is distributed in the hope that it will be useful, but WITHOUT
+   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+   or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
+   License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with GCC; see the file COPYING3.  If not see
+   <http://www.gnu.org/licenses/>.  */
+
+#define USE_INITFINI_ARRAY
+
+#undef INIT_SECTION_ASM_OP
+#undef FINI_SECTION_ASM_OP
+
+#undef INIT_ARRAY_SECTION_ASM_OP
+#define INIT_ARRAY_SECTION_ASM_OP
+
+#undef FINI_ARRAY_SECTION_ASM_OP
+#define FINI_ARRAY_SECTION_ASM_OP
+
+/* Use .init_array/.fini_array section for constructors and destructors. */
+#undef TARGET_ASM_CONSTRUCTOR
+#define TARGET_ASM_CONSTRUCTOR default_elf_init_array_asm_out_constructor
+#undef TARGET_ASM_DESTRUCTOR
+#define TARGET_ASM_DESTRUCTOR default_elf_fini_array_asm_out_destructor
diff --git a/gcc/crtstuff.c b/gcc/crtstuff.c
index b65f490..010d472 100644
--- a/gcc/crtstuff.c
+++ b/gcc/crtstuff.c
@@ -1,7 +1,8 @@ 
 /* Specialized bits of code needed to support construction and
    destruction of file-scope objects in C++ code.
    Copyright (C) 1991, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
-   2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc.
+   2002, 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011
+   Free Software Foundation, Inc.
    Contributed by Ron Guilmette (rfg@monkeys.com).
 
 This file is part of GCC.
@@ -189,6 +190,9 @@  typedef void (*func_ptr) (void);
    refer to only the __CTOR_END__ symbol in crtend.o and the __DTOR_LIST__
    symbol in crtbegin.o, where they are defined.  */
 
+/* No need for .ctors/.dtors section if linker can place them in
+   .init_array/.fini_array section.  */
+#ifndef USE_INITFINI_ARRAY
 /* The -1 is a flag to __do_global_[cd]tors indicating that this table
    does not start with a count of elements.  */
 #ifdef CTOR_LIST_BEGIN
@@ -219,6 +223,7 @@  STATIC func_ptr __DTOR_LIST__[1]
   __attribute__((section(".dtors"), aligned(sizeof(func_ptr))))
   = { (func_ptr) (-1) };
 #endif /* __DTOR_LIST__ alternatives */
+#endif /* USE_INITFINI_ARRAY */
 
 #ifdef USE_EH_FRAME_REGISTRY
 /* Stick a label at the beginning of the frame unwind info so we can register
@@ -489,6 +494,9 @@  __do_global_ctors_1(void)
 
 #elif defined(CRT_END) /* ! CRT_BEGIN */
 
+/* No need for .ctors/.dtors section if linker can place them in
+   .init_array/.fini_array section.  */
+#ifndef USE_INITFINI_ARRAY
 /* Put a word containing zero at the end of each of our two lists of function
    addresses.  Note that the words defined here go into the .ctors and .dtors
    sections of the crtend.o file, and since that file is always linked in
@@ -534,6 +542,7 @@  STATIC func_ptr __DTOR_END__[1]
   __attribute__((used, section(".dtors"), aligned(sizeof(func_ptr))))
   = { (func_ptr) 0 };
 #endif
+#endif /* USE_INITFINI_ARRAY */
 
 #ifdef EH_FRAME_SECTION_NAME
 /* Terminate the frame unwind info section with a 4byte 0 as a sentinel;
diff --git a/gcc/output.h b/gcc/output.h
index 7031b08..661b623 100644
--- a/gcc/output.h
+++ b/gcc/output.h
@@ -655,6 +655,8 @@  extern void file_end_indicate_split_stack (void);
 
 extern void default_elf_asm_output_external (FILE *file, tree,
 					     const char *);
+extern void default_elf_init_array_asm_out_constructor (rtx, int);
+extern void default_elf_fini_array_asm_out_destructor (rtx, int);
 extern int maybe_assemble_visibility (tree);
 
 extern int default_address_cost (rtx, bool);
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 40a8567..d15c278 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -7397,4 +7397,62 @@  make_debug_expr_from_rtl (const_rtx exp)
   return dval;
 }
 
+static GTY(()) section *elf_init_array_section;
+static GTY(()) section *elf_fini_array_section;
+
+static section *
+get_elf_initfini_array_priority_section (int priority,
+					 bool constructor_p)
+{
+  section *sec;
+  if (priority != DEFAULT_INIT_PRIORITY)
+    {
+      char buf[18];
+      sprintf (buf, "%s.%.5u", 
+	       constructor_p ? ".init_array" : ".fini_array",
+	       priority);
+      sec = get_section (buf, SECTION_WRITE, NULL_TREE);
+    }
+  else
+    {
+      if (constructor_p)
+	{
+	  if (elf_init_array_section == NULL)
+	    elf_init_array_section
+	      = get_unnamed_section (0, output_section_asm_op,
+				     "\t.section\t.init_array");
+	  sec = elf_init_array_section;
+	}
+      else
+	{
+	  if (elf_fini_array_section == NULL)
+	    elf_fini_array_section
+	      = get_unnamed_section (0, output_section_asm_op,
+				     "\t.section\t.fini_array");
+	  sec = elf_fini_array_section;
+	}
+    }
+  return sec;
+}
+
+/* Use .init_array section for constructors. */
+
+void
+default_elf_init_array_asm_out_constructor (rtx symbol, int priority)
+{
+  section *sec = get_elf_initfini_array_priority_section (priority,
+							  true);
+  assemble_addr_to_section (symbol, sec);
+}
+
+/* Use .fini_array section for destructors. */
+
+void
+default_elf_fini_array_asm_out_destructor (rtx symbol, int priority)
+{
+  section *sec = get_elf_initfini_array_priority_section (priority,
+							  false);
+  assemble_addr_to_section (symbol, sec);
+}
+
 #include "gt-varasm.h"