[v13,1/5] package/libiberty: new package
diff mbox series

Message ID 20190804001429.51451-1-aduskett@gmail.com
State New
Headers show
Series
  • [v13,1/5] package/libiberty: new package
Related show

Commit Message

Adam Duskett Aug. 4, 2019, 12:14 a.m. UTC
From: Adam Duskett <Aduskett@gmail.com>

Some packages, like prelink-cross, will want to use libiberty but do
not bundle their own instance (which is good!).

However, libiberty is made for being bundled in packages: all GNU
packages that use libiberty (gcc, binutils, gdb et al...) all have
their own bundled variant. This means that there is no official
upstream for libiberty; the closest being as part of the
combined binutils-gdb tree.

So we introduce a new host-only package, that installs just libiberty
from a binutils released tarball.

Again, as libiberty is usually bundled in packages, it usually only
install a static version. Furthermore, it does not obey to the usual
--enable-shared and --disable-static flags; it only ever builds a
static version.

Furthermore, this library is not built with -fPIC, but some packages
may pick it to build shared objects. This is the case for host-gdb,
for example, which accidentally picks that library instead of its
internal one.

So, rather than fix the various gdb versions and variants we can use,
we ensure that the libiberty we install is usable in shared objects,
and we ensure it is always built before host-gdb.

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Signed-off-by: Adam Duskett <Aduskett@gmail.com>
---
Changes v1 -> v11:
  - Add this patch to the series

 DEVELOPERS                       |  1 +
 package/libiberty/libiberty.hash |  2 ++
 package/libiberty/libiberty.mk   | 27 +++++++++++++++++++++++++++
 3 files changed, 30 insertions(+)
 create mode 100644 package/libiberty/libiberty.hash
 create mode 100644 package/libiberty/libiberty.mk

Comments

Arnout Vandecappelle Aug. 4, 2019, 10:23 p.m. UTC | #1
On 04/08/2019 02:14, aduskett@gmail.com wrote:
> From: Adam Duskett <Aduskett@gmail.com>
> 
> Some packages, like prelink-cross, will want to use libiberty but do
> not bundle their own instance (which is good!).
> 
> However, libiberty is made for being bundled in packages: all GNU
> packages that use libiberty (gcc, binutils, gdb et al...) all have
> their own bundled variant. This means that there is no official
> upstream for libiberty; the closest being as part of the
> combined binutils-gdb tree.
> 
> So we introduce a new host-only package, that installs just libiberty
> from a binutils released tarball.
> 
> Again, as libiberty is usually bundled in packages, it usually only
> install a static version. Furthermore, it does not obey to the usual
> --enable-shared and --disable-static flags; it only ever builds a
> static version.
> 
> Furthermore, this library is not built with -fPIC, but some packages
> may pick it to build shared objects. This is the case for host-gdb,
> for example, which accidentally picks that library instead of its
> internal one.
> 
> So, rather than fix the various gdb versions and variants we can use,
> we ensure that the libiberty we install is usable in shared objects,
> and we ensure it is always built before host-gdb.

 This is all pretty annoying. As discussed on IRC, libiberty really is only
needed for prelink-cross. And in fact, in the latest prelink-cross master, only
a single function from it is used, from the execstack executable. That gives us
the six following possible solutions to the problem:

1. This one, which has the disadvantage that it may have insofar hidden effects
on packages, like it does on gdb.

2. A separate package like this one, but install it in a different place (e.g.
--prefix=$(HOST_DIR)/libiberty), or not install it at all and instead copy the
library to prelink-cross. This avoids any influence on other packages.

3. Define it as an _EXTRA_DOWNLOAD of prelink-cross. However, that would need
either additional patching of the prelink-cross build system, or essentially two
packages (two configures, to builds, ...) in the prelink-cross package.

4. Don't build execstack, either by patching Makefile.am, or by setting
HOST_PRELINK_CROSS_MAKE_OPTS = prelink and manually copying the prelink executable.

5. Copy the required files into prelink-cross sources and add them to
Makefile.am (as an upstreamable patch). It's a pretty big patch though, 8 files
are needed: ansidecl.h filenames.h lbasename.c libiberty.h lrealpath.c
make-relative-prefix.c safe-ctype.c safe-ctype.h

6. Patch execstack to not call make_relative_prefix, or make a simplified
implementation. That may be quite a bit of work.


 However, solution 1 is still an option. So

Acked-by: Arnout Vandecappelle (Essensium/Mind) <arnout@mind.be>

 Regards,
 Arnout


> Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
> Signed-off-by: Adam Duskett <Aduskett@gmail.com>
> ---
> Changes v1 -> v11:
>   - Add this patch to the series
> 
>  DEVELOPERS                       |  1 +
>  package/libiberty/libiberty.hash |  2 ++
>  package/libiberty/libiberty.mk   | 27 +++++++++++++++++++++++++++
>  3 files changed, 30 insertions(+)
>  create mode 100644 package/libiberty/libiberty.hash
>  create mode 100644 package/libiberty/libiberty.mk
> 
> diff --git a/DEVELOPERS b/DEVELOPERS
> index 8a83f748d1..e9da0c7f50 100644
> --- a/DEVELOPERS
> +++ b/DEVELOPERS
> @@ -2362,6 +2362,7 @@ F:	package/keyutils/
>  F:	package/libbsd/
>  F:	package/libedit/
>  F:	package/libgsm/
> +F:	package/libiberty/
>  F:	package/libinput/
>  F:	package/libiscsi/
>  F:	package/libpri/
> diff --git a/package/libiberty/libiberty.hash b/package/libiberty/libiberty.hash
> new file mode 100644
> index 0000000000..270f38dfa7
> --- /dev/null
> +++ b/package/libiberty/libiberty.hash
> @@ -0,0 +1,2 @@
> +# From ftp://gcc.gnu.org/pub/binutils/releases/sha512.sum
> +sha512  d326408f12a03d9a61a9de56584c2af12f81c2e50d2d7e835d51565df8314df01575724afa1e43bd0db45cfc9916b41519b67dfce03232aa4978704492a6994a  binutils-2.32.tar.xz
> diff --git a/package/libiberty/libiberty.mk b/package/libiberty/libiberty.mk
> new file mode 100644
> index 0000000000..17976fdd4f
> --- /dev/null
> +++ b/package/libiberty/libiberty.mk
> @@ -0,0 +1,27 @@
> +################################################################################
> +#
> +# libiberty
> +#
> +################################################################################
> +
> +LIBIBERTY_VERSION = 2.32
> +LIBIBERTY_SOURCE = binutils-$(LIBIBERTY_VERSION).tar.xz
> +LIBIBERTY_SITE = $(BR2_GNU_MIRROR)/binutils
> +LIBIBERTY_DL_SUBDIR = binutils
> +LIBIBERTY_SUBDIR = libiberty
> +
> +# We explicitly disable multilib, as we do in binutils.
> +# By default, libiberty installs nothing, so we must force it.
> +HOST_LIBIBERTY_CONF_OPTS = \
> +	--disable-multilib \
> +	--enable-install-libiberty
> +
> +# Some packages (e.g. host-gdb) will pick this library and build shared
> +# objects with it. But libiberty does not honour the --enable-shared and
> +# --disable-static flags; it only ever builds a static library no matter
> +# what. So we must force -fPIC in build flags.
> +HOST_LIBIBERTY_CONF_ENV = \
> +	CFLAGS="$(HOST_CFLAGS) -fPIC" \
> +	LDFLAGS="$(HOST_LDFLAGS) -fPIC"
> +
> +$(eval $(host-autotools-package))
>
Adam Duskett Aug. 5, 2019, 11:39 a.m. UTC | #2
Hey Yann and Thomas, if possible I would like your opinion on this as well.

Thanks!

Adam

Patch
diff mbox series

diff --git a/DEVELOPERS b/DEVELOPERS
index 8a83f748d1..e9da0c7f50 100644
--- a/DEVELOPERS
+++ b/DEVELOPERS
@@ -2362,6 +2362,7 @@  F:	package/keyutils/
 F:	package/libbsd/
 F:	package/libedit/
 F:	package/libgsm/
+F:	package/libiberty/
 F:	package/libinput/
 F:	package/libiscsi/
 F:	package/libpri/
diff --git a/package/libiberty/libiberty.hash b/package/libiberty/libiberty.hash
new file mode 100644
index 0000000000..270f38dfa7
--- /dev/null
+++ b/package/libiberty/libiberty.hash
@@ -0,0 +1,2 @@ 
+# From ftp://gcc.gnu.org/pub/binutils/releases/sha512.sum
+sha512  d326408f12a03d9a61a9de56584c2af12f81c2e50d2d7e835d51565df8314df01575724afa1e43bd0db45cfc9916b41519b67dfce03232aa4978704492a6994a  binutils-2.32.tar.xz
diff --git a/package/libiberty/libiberty.mk b/package/libiberty/libiberty.mk
new file mode 100644
index 0000000000..17976fdd4f
--- /dev/null
+++ b/package/libiberty/libiberty.mk
@@ -0,0 +1,27 @@ 
+################################################################################
+#
+# libiberty
+#
+################################################################################
+
+LIBIBERTY_VERSION = 2.32
+LIBIBERTY_SOURCE = binutils-$(LIBIBERTY_VERSION).tar.xz
+LIBIBERTY_SITE = $(BR2_GNU_MIRROR)/binutils
+LIBIBERTY_DL_SUBDIR = binutils
+LIBIBERTY_SUBDIR = libiberty
+
+# We explicitly disable multilib, as we do in binutils.
+# By default, libiberty installs nothing, so we must force it.
+HOST_LIBIBERTY_CONF_OPTS = \
+	--disable-multilib \
+	--enable-install-libiberty
+
+# Some packages (e.g. host-gdb) will pick this library and build shared
+# objects with it. But libiberty does not honour the --enable-shared and
+# --disable-static flags; it only ever builds a static library no matter
+# what. So we must force -fPIC in build flags.
+HOST_LIBIBERTY_CONF_ENV = \
+	CFLAGS="$(HOST_CFLAGS) -fPIC" \
+	LDFLAGS="$(HOST_LDFLAGS) -fPIC"
+
+$(eval $(host-autotools-package))