We need only libbfd, libiberty and libopcodes from binutils native.
To get them we build entire binutils with --enable-targets=all to
include all possible output targets support and then remove all but
these three libs.

This has two side effects:

  1) it wastes build time
  2) may cause errors caused by --enable-targets=all on some exotics
     build hosts like PowerPC 32bit

To address both of these effects we can configure binutils in general
and only required libs and their dependencies (zlib and intl at the
time). Then build only build these libs and their dependencies.

Regarding to PowerPC 32-bit build host issues we get following errors
when building on Ubuntu 16.04 LTS for PowerPC with command:

  MACHINE=qemuppc setarch ppc bitbake binutils-native

<output omitted>
| /usr/lib/gcc/powerpc-linux-gnu/5/../../../powerpc-linux-gnu/crti.o: In 
function `_init':
| (.init+0x22): relocation truncated to fit: R_PPC_GOT16 against undefined 
symbol `__gmon_start__'
| dwarf.o: In function `parse_gnu_debuglink':
| dwarf.c:(.text+0x482): relocation truncated to fit: R_PPC_GOT16 against 
symbol `byte_get' defined in .sbss section in elfcomm.o
| dwarf.o: In function `fetch_indexed_string':
| dwarf.c:(.text+0x8fa): relocation truncated to fit: R_PPC_GOT16 against 
symbol `byte_get' defined in .sbss section in elfcomm.o
| dwarf.o: In function `read_debug_line_header':
| dwarf.c:(.text+0x114a): relocation truncated to fit: R_PPC_GOT16 against 
symbol `byte_get' defined in .sbss section in elfcomm.o
| dwarf.c:(.text+0x12c6): relocation truncated to fit: R_PPC_GOT16 against 
symbol `byte_get' defined in .sbss section in elfcomm.o
| dwarf.o: In function `display_debug_ranges_list':
| dwarf.c:(.text+0x187e): relocation truncated to fit: R_PPC_GOT16 against 
symbol `byte_get' defined in .sbss section in elfcomm.o
| dwarf.c:(.text+0x18a2): relocation truncated to fit: R_PPC_GOT16 against 
symbol `stdout@@GLIBC_2.0' defined in .sdata section in 
/lib/powerpc-linux-gnu/libc.so.6
| dwarf.o: In function `display_debug_rnglists_list':
| dwarf.c:(.text+0x1bf2): relocation truncated to fit: R_PPC_GOT16 against 
symbol `byte_get' defined in .sbss section in elfcomm.o
| dwarf.c:(.text+0x1c06): relocation truncated to fit: R_PPC_GOT16 against 
symbol `stdout@@GLIBC_2.0' defined in .sdata section in 
/lib/powerpc-linux-gnu/libc.so.6
| dwarf.o: In function `display_block':
| dwarf.c:(.text+0x2486): relocation truncated to fit: R_PPC_GOT16 against 
symbol `byte_get' defined in .sbss section in elfcomm.o
| dwarf.o: In function `introduce.isra.2':
| dwarf.c:(.text+0x2556): additional relocation overflows omitted from the 
output
| collect2: error: ld returned 1 exit status
| Makefile:909: recipe for target 'objdump' failed
| make[4]: *** [objdump] Error 1
| make[4]: *** Waiting for unfinished jobs....
<output omitted>

While 'byte_get' is defined in small bss section in elfcomm.o and
generally can be fixed, symbol from host glibc 'stdout@@GLIBC_2.0' in
small data section can't be moved without recompile of Ubuntu 16.04 LTS
glibc.

Signed-off-by: Serhey Popovych <serhe.popov...@gmail.com>
---
 meta/recipes-devtools/binutils/binutils_2.31.bb | 33 ++++++++++++++-----------
 1 file changed, 19 insertions(+), 14 deletions(-)

diff --git a/meta/recipes-devtools/binutils/binutils_2.31.bb 
b/meta/recipes-devtools/binutils/binutils_2.31.bb
index 51a9748..6796749 100644
--- a/meta/recipes-devtools/binutils/binutils_2.31.bb
+++ b/meta/recipes-devtools/binutils/binutils_2.31.bb
@@ -20,26 +20,31 @@ EXTRA_OECONF_class-native = "--enable-targets=all \
                              --enable-install-libbfd \
                              --disable-werror"
 
+do_configure_append_class-native () {
+       for l in zlib intl bfd libiberty opcodes; do
+               oe_runmake configure-${l}
+       done
+}
+
+do_compile_class-native () {
+       for l in zlib intl bfd libiberty opcodes; do
+               cd "${l}"
+               autotools_do_compile
+               cd - >/dev/null
+       done
+}
+
 do_install_class-native () {
-       autotools_do_install
+       for l in bfd libiberty opcodes; do
+               cd "${l}"
+               autotools_do_install
+               cd - >/dev/null
+       done
 
        # Install the libiberty header
        install -d ${D}${includedir}
        install -m 644 ${S}/include/ansidecl.h ${D}${includedir}
        install -m 644 ${S}/include/libiberty.h ${D}${includedir}
-
-       # We only want libiberty, libbfd and libopcodes
-       rm -rf ${D}${bindir}
-       rm -rf ${D}${prefix}/${TARGET_SYS}
-       rm -rf ${D}${prefix}/lib/ldscripts
-       rm -rf ${D}${prefix}/share/info
-       rm -rf ${D}${prefix}/share/locale
-       rm -rf ${D}${prefix}/share/man
-       rmdir ${D}${prefix}/share || :
-       rmdir ${D}/${libdir}/gcc-lib || :
-       rmdir ${D}/${libdir}64/gcc-lib || :
-       rmdir ${D}/${libdir} || :
-       rmdir ${D}/${libdir}64 || :
 }
 
 # Split out libbfd-*.so so including perf doesn't include extra stuff
-- 
2.7.4

-- 
_______________________________________________
Openembedded-core mailing list
Openembedded-core@lists.openembedded.org
http://lists.openembedded.org/mailman/listinfo/openembedded-core

Reply via email to