Patchwork Disable building libgcc with -O0

login
register
mail settings
Submitter Lei Liu
Date Nov. 11, 2013, 4:30 a.m.
Message ID <52805D73.4050306@gmail.com>
Download mbox | patch
Permalink /patch/61395/
State New
Headers show

Comments

Lei Liu - Nov. 11, 2013, 4:30 a.m.
Link error happens for valgrind when linking unoptimized libgcc.
Libgcc requires symbol _Unwind_Resume defined in libgcc_eh which
in turn requires pulling in entire glibc.  We can't make valgrind
link with glibc due to its design.  So don't build libgcc without
optimizations, so that calls to _Unwind_Resume get eliminated.

Signed-off-by: Lei Liu <lei.liu2@windriver.com>
---
 meta/recipes-devtools/gcc/gcc-cross.inc | 9 +++++++++
 1 file changed, 9 insertions(+)

--
1.8.2.1
Saul Wold - Nov. 12, 2013, 3:01 p.m.
Please fix up the comment to follow the guildlines on this patch and 
your other one.

http://www.openembedded.org/wiki/Commit_Patch_Message_Guidelines

Sau!


On 11/10/2013 08:30 PM, Lei Liu wrote:
> Link error happens for valgrind when linking unoptimized libgcc.
> Libgcc requires symbol _Unwind_Resume defined in libgcc_eh which
> in turn requires pulling in entire glibc.  We can't make valgrind
> link with glibc due to its design.  So don't build libgcc without
> optimizations, so that calls to _Unwind_Resume get eliminated.
>
> Signed-off-by: Lei Liu <lei.liu2@windriver.com>
> ---
>   meta/recipes-devtools/gcc/gcc-cross.inc | 9 +++++++++
>   1 file changed, 9 insertions(+)
>
> diff --git a/meta/recipes-devtools/gcc/gcc-cross.inc b/meta/recipes-devtools/gcc/gcc-cross.inc
> index 25a3142..cf03c08 100644
> --- a/meta/recipes-devtools/gcc/gcc-cross.inc
> +++ b/meta/recipes-devtools/gcc/gcc-cross.inc
> @@ -25,6 +25,15 @@ EXTRA_OECONF_PATHS = " \
>
>   ARCH_FLAGS_FOR_TARGET += "-isystem${STAGING_DIR_TARGET}${target_includedir}"
>
> +def get_optimization(d):
> +    selected_optimization = d.getVar("SELECTED_OPTIMIZATION", True)
> +    if base_contains("SELECTED_OPTIMIZATION", "-O0", "x", "", d) == "x":
> +        bb.note("libgcc can't be built with -O0, -O2 will be used instead.")
> +        return selected_optimization.replace("-O0", "-O2")
> +    return selected_optimization
> +
> +SELECTED_OPTIMIZATION := "${@get_optimization(d)}"
> +
>   do_configure_prepend () {
>   	sed -i 's/BUILD_INFO=info/BUILD_INFO=/' ${S}/gcc/configure
>   }
> --
> 1.8.2.1
> _______________________________________________
> Openembedded-core mailing list
> Openembedded-core@lists.openembedded.org
> http://lists.openembedded.org/mailman/listinfo/openembedded-core
>
Phil Blundell - Nov. 12, 2013, 11:58 p.m.
On Mon, 2013-11-11 at 12:30 +0800, Lei Liu wrote:
> +def get_optimization(d):
> +    selected_optimization = d.getVar("SELECTED_OPTIMIZATION", True)
> +    if base_contains("SELECTED_OPTIMIZATION", "-O0", "x", "", d) == "x":
> +        bb.note("libgcc can't be built with -O0, -O2 will be used instead.")
> +        return selected_optimization.replace("-O0", "-O2")
> +    return selected_optimization
> +
> +SELECTED_OPTIMIZATION := "${@get_optimization(d)}"

Do we really need a Python function for this?  It seems like a rather
heavyweight mechanism to detect what is basically just a distro
misconfiguration.

How about just patching the appropriate bit of libgcc to include:

#if __OPTIMIZE__ == 0
#error libgcc can't be built with -O0, please fix your distro to use at least -O1
#endif

or some such?  Even this seems slightly dubious, since it will prevent
you from building an unoptimised libgcc even if you have no intention of
running valgrind with it, but at least this doesn't add extra overhead
within bitbake.

p.
Lei Liu - Nov. 13, 2013, 3:02 a.m.
On 2013?11?13? 07:58, Phil Blundell wrote:
> On Mon, 2013-11-11 at 12:30 +0800, Lei Liu wrote:
>> +def get_optimization(d):
>> +    selected_optimization = d.getVar("SELECTED_OPTIMIZATION", True)
>> +    if base_contains("SELECTED_OPTIMIZATION", "-O0", "x", "", d) == "x":
>> +        bb.note("libgcc can't be built with -O0, -O2 will be used instead.")
>> +        return selected_optimization.replace("-O0", "-O2")
>> +    return selected_optimization
>> +
>> +SELECTED_OPTIMIZATION := "${@get_optimization(d)}"
> Do we really need a Python function for this?  It seems like a rather
> heavyweight mechanism to detect what is basically just a distro
> misconfiguration.

The python function is copied from eglibc recipe which does similar
job to force build the package with optimization enabled.  I think
it's not just a distro misconfiguration.  Sometimes it would be
convenient for user to select a global -O0 optimization level (to
create a more debug-friendly rootfs) for most packages, while
automatically switching to -O2 for those which can't be built without
optimizations.

>
> How about just patching the appropriate bit of libgcc to include:
>
> #if __OPTIMIZE__ == 0
> #error libgcc can't be built with -O0, please fix your distro to use at least -O1
> #endif

I think it would be more helpful if we can switch to -O1 or -O2 in
such case, instead of throwing out an error.

Lei

>
> or some such?  Even this seems slightly dubious, since it will prevent
> you from building an unoptimised libgcc even if you have no intention of
> running valgrind with it, but at least this doesn't add extra overhead
> within bitbake.
>
> p.
>
>
Phil Blundell - Nov. 13, 2013, 7:44 a.m.
On Wed, Nov 13, 2013 at 11:02:36AM +0800, Lei Liu wrote:
> On 2013?11?13? 07:58, Phil Blundell wrote:
> > On Mon, 2013-11-11 at 12:30 +0800, Lei Liu wrote:
> >> +def get_optimization(d):
> >> +    selected_optimization = d.getVar("SELECTED_OPTIMIZATION", True)
> >> +    if base_contains("SELECTED_OPTIMIZATION", "-O0", "x", "", d) == "x":
> >> +        bb.note("libgcc can't be built with -O0, -O2 will be used instead.")
> >> +        return selected_optimization.replace("-O0", "-O2")
> >> +    return selected_optimization
> >> +
> >> +SELECTED_OPTIMIZATION := "${@get_optimization(d)}"
> > Do we really need a Python function for this?  It seems like a rather
> > heavyweight mechanism to detect what is basically just a distro
> > misconfiguration.
> 
> The python function is copied from eglibc recipe which does similar
> job to force build the package with optimization enabled.  I think
> it's not just a distro misconfiguration.  Sometimes it would be
> convenient for user to select a global -O0 optimization level (to
> create a more debug-friendly rootfs) for most packages, while
> automatically switching to -O2 for those which can't be built without
> optimizations.

Sometimes, perhaps, but automatically switching seems to violate the 
principle of least surprise.  If I've set CFLAGS to "-O0" in my distro 
configuration then that's what I would expect the recipes to be using.  
I would not expect random recipes to start second-guessing me and 
selecting different CFLAGS.

If I wanted to build libgcc with -O but everything else with -O0 then 
that's easy enough to achieve:

SELECTED_OPTIMIZATION = "-O0"
SELECTED_OPTIMIZATION_libgcc = "-O"

or whatever.

p.

Patch

diff --git a/meta/recipes-devtools/gcc/gcc-cross.inc b/meta/recipes-devtools/gcc/gcc-cross.inc
index 25a3142..cf03c08 100644
--- a/meta/recipes-devtools/gcc/gcc-cross.inc
+++ b/meta/recipes-devtools/gcc/gcc-cross.inc
@@ -25,6 +25,15 @@  EXTRA_OECONF_PATHS = " \
 
 ARCH_FLAGS_FOR_TARGET += "-isystem${STAGING_DIR_TARGET}${target_includedir}"
 
+def get_optimization(d):
+    selected_optimization = d.getVar("SELECTED_OPTIMIZATION", True)
+    if base_contains("SELECTED_OPTIMIZATION", "-O0", "x", "", d) == "x":
+        bb.note("libgcc can't be built with -O0, -O2 will be used instead.")
+        return selected_optimization.replace("-O0", "-O2")
+    return selected_optimization
+
+SELECTED_OPTIMIZATION := "${@get_optimization(d)}"
+
 do_configure_prepend () {
 	sed -i 's/BUILD_INFO=info/BUILD_INFO=/' ${S}/gcc/configure
 }