All of lore.kernel.org
 help / color / mirror / Atom feed
* [Buildroot] [PATCH] Makefile: respect strip exclusions for special libraries
@ 2018-07-02 16:00 John Keeping
  2018-07-02 16:40 ` Yann E. MORIN
  0 siblings, 1 reply; 8+ messages in thread
From: John Keeping @ 2018-07-02 16:00 UTC (permalink / raw)
  To: buildroot

ld-*.so and libpthread*.so* are not stripped in the same way as other
binaries because some applications need symbols in these libraries in
order to operate correctly.

However, the special handling for these binaries ignores the usual
BR2_STRIP_EXCLUDE_* rules so it is not possible to build an image which
has debugging symbols in these binaries.

Instead of running one-off commands to strip each of these special
binaries, build a single command for everything that needs
$(STRIP_STRIP_DEBUG) and include the normal exclusion rules in this
command.

Signed-off-by: John Keeping <john@metanate.com>
---
 Makefile | 32 +++++++++++++++++++++-----------
 1 file changed, 21 insertions(+), 11 deletions(-)

diff --git a/Makefile b/Makefile
index 8d25c8a239..2deb5fd54a 100644
--- a/Makefile
+++ b/Makefile
@@ -606,6 +606,26 @@ STRIP_FIND_CMD += -type f \( -perm /111 -o -name '*.so*' \)
 #   done for kernel modules with incorrect permissions.
 STRIP_FIND_CMD += -not \( $(call findfileclauses,libpthread*.so* ld-*.so* *.ko $(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) -print0
 
+# This is the command used to handle the special cases above.
+STRIP_SPECIAL_LIBS_CMD = find $(TARGET_DIR)/lib/
+ifneq (,$(filter lib/%,$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS))))
+STRIP_SPECIAL_LIBS_CMD += \( $(call finddirclauses,$(TARGET_DIR),$(BR2_STRIP_EXCLUDE_DIRS)) \) -prune -o
+endif
+# Valgrind needs ld.so with enough information, so only strip
+# debugging symbols.
+STRIP_SPECIAL_LIBS_CMD += \( -name 'ld-*.so*'
+ifeq ($(BR2_TOOLCHAIN_HAS_THREADS),y)
+# See http://sourceware.org/gdb/wiki/FAQ, "GDB does not see any threads
+# besides the one in which crash occurred; or SIGTRAP kills my program when
+# I set a breakpoint"
+STRIP_SPECIAL_LIBS_CMD += -o -name 'libpthread*.so*'
+endif
+STRIP_SPECIAL_LIBS_CMD += \)
+ifneq (,$(call qstrip,$(BR2_STRIP_EXCLUDE_FILES)))
+STRIP_SPECIAL_LIBS_CMD += -not \( $(call qstrip,$(BR2_STRIP_EXCLUDE_FILES)) \)
+endif
+STRIP_SPECIAL_LIBS_CMD += | xargs -r $(STRIPCMD) $(STRIP_STRIP_DEBUG)
+
 ifeq ($(BR2_ECLIPSE_REGISTER),y)
 define TOOLCHAIN_ECLIPSE_REGISTER
 	./support/scripts/eclipse-register-toolchain `readlink -f $(O)` \
@@ -717,18 +737,8 @@ endif
 	rmdir $(TARGET_DIR)/usr/share 2>/dev/null || true
 	$(STRIP_FIND_CMD) | xargs -0 $(STRIPCMD) 2>/dev/null || true
 
-# See http://sourceware.org/gdb/wiki/FAQ, "GDB does not see any threads
-# besides the one in which crash occurred; or SIGTRAP kills my program when
-# I set a breakpoint"
-ifeq ($(BR2_TOOLCHAIN_HAS_THREADS),y)
-	find $(TARGET_DIR)/lib/ -type f -name 'libpthread*.so*' | \
-		xargs -r $(STRIPCMD) $(STRIP_STRIP_DEBUG)
-endif
+	$(STRIP_SPECIAL_LIBS_CMD) || true
 
-# Valgrind needs ld.so with enough information, so only strip
-# debugging symbols.
-	find $(TARGET_DIR)/lib/ -type f -name 'ld-*.so*' | \
-		xargs -r $(STRIPCMD) $(STRIP_STRIP_DEBUG)
 	test -f $(TARGET_DIR)/etc/ld.so.conf && \
 		{ echo "ERROR: we shouldn't have a /etc/ld.so.conf file"; exit 1; } || true
 	test -d $(TARGET_DIR)/etc/ld.so.conf.d && \
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Buildroot] [PATCH] Makefile: respect strip exclusions for special libraries
  2018-07-02 16:00 [Buildroot] [PATCH] Makefile: respect strip exclusions for special libraries John Keeping
@ 2018-07-02 16:40 ` Yann E. MORIN
  2018-07-02 16:57   ` [Buildroot] [PATCH v2] " John Keeping
  0 siblings, 1 reply; 8+ messages in thread
From: Yann E. MORIN @ 2018-07-02 16:40 UTC (permalink / raw)
  To: buildroot

John, All,

On 2018-07-02 17:00 +0100, John Keeping spake thusly:
> ld-*.so and libpthread*.so* are not stripped in the same way as other
> binaries because some applications need symbols in these libraries in
> order to operate correctly.
> 
> However, the special handling for these binaries ignores the usual
> BR2_STRIP_EXCLUDE_* rules so it is not possible to build an image which
> has debugging symbols in these binaries.
> 
> Instead of running one-off commands to strip each of these special
> binaries, build a single command for everything that needs
> $(STRIP_STRIP_DEBUG) and include the normal exclusion rules in this
> command.
> 
> Signed-off-by: John Keeping <john@metanate.com>
> ---
>  Makefile | 32 +++++++++++++++++++++-----------
>  1 file changed, 21 insertions(+), 11 deletions(-)
> 
> diff --git a/Makefile b/Makefile
> index 8d25c8a239..2deb5fd54a 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -606,6 +606,26 @@ STRIP_FIND_CMD += -type f \( -perm /111 -o -name '*.so*' \)
>  #   done for kernel modules with incorrect permissions.
>  STRIP_FIND_CMD += -not \( $(call findfileclauses,libpthread*.so* ld-*.so* *.ko $(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) -print0
>  
> +# This is the command used to handle the special cases above.
> +STRIP_SPECIAL_LIBS_CMD = find $(TARGET_DIR)/lib/
> +ifneq (,$(filter lib/%,$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS))))
> +STRIP_SPECIAL_LIBS_CMD += \( $(call finddirclauses,$(TARGET_DIR),$(BR2_STRIP_EXCLUDE_DIRS)) \) -prune -o
> +endif
> +# Valgrind needs ld.so with enough information, so only strip
> +# debugging symbols.
> +STRIP_SPECIAL_LIBS_CMD += \( -name 'ld-*.so*'
> +ifeq ($(BR2_TOOLCHAIN_HAS_THREADS),y)
> +# See http://sourceware.org/gdb/wiki/FAQ, "GDB does not see any threads
> +# besides the one in which crash occurred; or SIGTRAP kills my program when
> +# I set a breakpoint"
> +STRIP_SPECIAL_LIBS_CMD += -o -name 'libpthread*.so*'
> +endif
> +STRIP_SPECIAL_LIBS_CMD += \)
> +ifneq (,$(call qstrip,$(BR2_STRIP_EXCLUDE_FILES)))
> +STRIP_SPECIAL_LIBS_CMD += -not \( $(call qstrip,$(BR2_STRIP_EXCLUDE_FILES)) \)

I guess you forgot to use 'findfileclauses' here, that is:

    STRIP_SPECIAL_LIBS_CMD += -not \( $(call findfileclauses,$(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \)

Otherwise, expansion of the variable would give an invalide find
pattern, like so:

    -not \( some-excluded-file some-other-file a-tird-file \)

Or did I miss something?

Regards,
Yann E. MORIN.

> +endif
> +STRIP_SPECIAL_LIBS_CMD += | xargs -r $(STRIPCMD) $(STRIP_STRIP_DEBUG)
> +
>  ifeq ($(BR2_ECLIPSE_REGISTER),y)
>  define TOOLCHAIN_ECLIPSE_REGISTER
>  	./support/scripts/eclipse-register-toolchain `readlink -f $(O)` \
> @@ -717,18 +737,8 @@ endif
>  	rmdir $(TARGET_DIR)/usr/share 2>/dev/null || true
>  	$(STRIP_FIND_CMD) | xargs -0 $(STRIPCMD) 2>/dev/null || true
>  
> -# See http://sourceware.org/gdb/wiki/FAQ, "GDB does not see any threads
> -# besides the one in which crash occurred; or SIGTRAP kills my program when
> -# I set a breakpoint"
> -ifeq ($(BR2_TOOLCHAIN_HAS_THREADS),y)
> -	find $(TARGET_DIR)/lib/ -type f -name 'libpthread*.so*' | \
> -		xargs -r $(STRIPCMD) $(STRIP_STRIP_DEBUG)
> -endif
> +	$(STRIP_SPECIAL_LIBS_CMD) || true
>  
> -# Valgrind needs ld.so with enough information, so only strip
> -# debugging symbols.
> -	find $(TARGET_DIR)/lib/ -type f -name 'ld-*.so*' | \
> -		xargs -r $(STRIPCMD) $(STRIP_STRIP_DEBUG)
>  	test -f $(TARGET_DIR)/etc/ld.so.conf && \
>  		{ echo "ERROR: we shouldn't have a /etc/ld.so.conf file"; exit 1; } || true
>  	test -d $(TARGET_DIR)/etc/ld.so.conf.d && \
> -- 
> 2.18.0
> 
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Buildroot] [PATCH v2] Makefile: respect strip exclusions for special libraries
  2018-07-02 16:40 ` Yann E. MORIN
@ 2018-07-02 16:57   ` John Keeping
  2018-07-02 20:25     ` Thomas Petazzoni
  0 siblings, 1 reply; 8+ messages in thread
From: John Keeping @ 2018-07-02 16:57 UTC (permalink / raw)
  To: buildroot

ld-*.so and libpthread*.so* are not stripped in the same way as other
binaries because some applications need symbols in these libraries in
order to operate correctly.

However, the special handling for these binaries ignores the usual
BR2_STRIP_EXCLUDE_* rules so it is not possible to build an image which
has debugging symbols in these binaries.

Instead of running one-off commands to strip each of these special
binaries, build a single command for everything that needs
$(STRIP_STRIP_DEBUG) and include the normal exclusion rules in this
command.

Signed-off-by: John Keeping <john@metanate.com>
---
On Mon, 2 Jul 2018 18:40:44 +0200
"Yann E. MORIN" <yann.morin.1998@free.fr> wrote:

> I guess you forgot to use 'findfileclauses' here, that is:
> 
>     STRIP_SPECIAL_LIBS_CMD += -not \( $(call findfileclauses,$(call
> qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \)
> 
> Otherwise, expansion of the variable would give an invalide find
> pattern, like so:
> 
>     -not \( some-excluded-file some-other-file a-tird-file \)
> 
> Or did I miss something?

You're right, I'm not sure how this worked when I tested it.  Here's an
updated patch.


 Makefile | 32 +++++++++++++++++++++-----------
 1 file changed, 21 insertions(+), 11 deletions(-)

diff --git a/Makefile b/Makefile
index 8d25c8a239..a2d21be243 100644
--- a/Makefile
+++ b/Makefile
@@ -606,6 +606,26 @@ STRIP_FIND_CMD += -type f \( -perm /111 -o -name '*.so*' \)
 #   done for kernel modules with incorrect permissions.
 STRIP_FIND_CMD += -not \( $(call findfileclauses,libpthread*.so* ld-*.so* *.ko $(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) -print0
 
+# This is the command used to handle the special cases above.
+STRIP_SPECIAL_LIBS_CMD = find $(TARGET_DIR)/lib/
+ifneq (,$(filter lib/%,$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS))))
+STRIP_SPECIAL_LIBS_CMD += \( $(call finddirclauses,$(TARGET_DIR),$(BR2_STRIP_EXCLUDE_DIRS)) \) -prune -o
+endif
+# Valgrind needs ld.so with enough information, so only strip
+# debugging symbols.
+STRIP_SPECIAL_LIBS_CMD += \( -name 'ld-*.so*'
+ifeq ($(BR2_TOOLCHAIN_HAS_THREADS),y)
+# See http://sourceware.org/gdb/wiki/FAQ, "GDB does not see any threads
+# besides the one in which crash occurred; or SIGTRAP kills my program when
+# I set a breakpoint"
+STRIP_SPECIAL_LIBS_CMD += -o -name 'libpthread*.so*'
+endif
+STRIP_SPECIAL_LIBS_CMD += \)
+ifneq (,$(call qstrip,$(BR2_STRIP_EXCLUDE_FILES)))
+STRIP_SPECIAL_LIBS_CMD += -not \( $(call findfileclauses,$(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \)
+endif
+STRIP_SPECIAL_LIBS_CMD += | xargs -r $(STRIPCMD) $(STRIP_STRIP_DEBUG)
+
 ifeq ($(BR2_ECLIPSE_REGISTER),y)
 define TOOLCHAIN_ECLIPSE_REGISTER
 	./support/scripts/eclipse-register-toolchain `readlink -f $(O)` \
@@ -717,18 +737,8 @@ endif
 	rmdir $(TARGET_DIR)/usr/share 2>/dev/null || true
 	$(STRIP_FIND_CMD) | xargs -0 $(STRIPCMD) 2>/dev/null || true
 
-# See http://sourceware.org/gdb/wiki/FAQ, "GDB does not see any threads
-# besides the one in which crash occurred; or SIGTRAP kills my program when
-# I set a breakpoint"
-ifeq ($(BR2_TOOLCHAIN_HAS_THREADS),y)
-	find $(TARGET_DIR)/lib/ -type f -name 'libpthread*.so*' | \
-		xargs -r $(STRIPCMD) $(STRIP_STRIP_DEBUG)
-endif
+	$(STRIP_SPECIAL_LIBS_CMD) || true
 
-# Valgrind needs ld.so with enough information, so only strip
-# debugging symbols.
-	find $(TARGET_DIR)/lib/ -type f -name 'ld-*.so*' | \
-		xargs -r $(STRIPCMD) $(STRIP_STRIP_DEBUG)
 	test -f $(TARGET_DIR)/etc/ld.so.conf && \
 		{ echo "ERROR: we shouldn't have a /etc/ld.so.conf file"; exit 1; } || true
 	test -d $(TARGET_DIR)/etc/ld.so.conf.d && \
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Buildroot] [PATCH v2] Makefile: respect strip exclusions for special libraries
  2018-07-02 16:57   ` [Buildroot] [PATCH v2] " John Keeping
@ 2018-07-02 20:25     ` Thomas Petazzoni
  2018-07-02 21:04       ` Yann E. MORIN
  2018-07-03 10:06       ` [Buildroot] [PATCH v3] " John Keeping
  0 siblings, 2 replies; 8+ messages in thread
From: Thomas Petazzoni @ 2018-07-02 20:25 UTC (permalink / raw)
  To: buildroot

Hello,

On Mon, 2 Jul 2018 17:57:11 +0100, John Keeping wrote:

> diff --git a/Makefile b/Makefile
> index 8d25c8a239..a2d21be243 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -606,6 +606,26 @@ STRIP_FIND_CMD += -type f \( -perm /111 -o -name '*.so*' \)
>  #   done for kernel modules with incorrect permissions.
>  STRIP_FIND_CMD += -not \( $(call findfileclauses,libpthread*.so* ld-*.so* *.ko $(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) -print0
>  
> +# This is the command used to handle the special cases above.
> +STRIP_SPECIAL_LIBS_CMD = find $(TARGET_DIR)/lib/
> +ifneq (,$(filter lib/%,$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS))))
> +STRIP_SPECIAL_LIBS_CMD += \( $(call finddirclauses,$(TARGET_DIR),$(BR2_STRIP_EXCLUDE_DIRS)) \) -prune -o
> +endif
> +# Valgrind needs ld.so with enough information, so only strip
> +# debugging symbols.
> +STRIP_SPECIAL_LIBS_CMD += \( -name 'ld-*.so*'
> +ifeq ($(BR2_TOOLCHAIN_HAS_THREADS),y)
> +# See http://sourceware.org/gdb/wiki/FAQ, "GDB does not see any threads
> +# besides the one in which crash occurred; or SIGTRAP kills my program when
> +# I set a breakpoint"
> +STRIP_SPECIAL_LIBS_CMD += -o -name 'libpthread*.so*'
> +endif
> +STRIP_SPECIAL_LIBS_CMD += \)
> +ifneq (,$(call qstrip,$(BR2_STRIP_EXCLUDE_FILES)))
> +STRIP_SPECIAL_LIBS_CMD += -not \( $(call findfileclauses,$(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \)
> +endif
> +STRIP_SPECIAL_LIBS_CMD += | xargs -r $(STRIPCMD) $(STRIP_STRIP_DEBUG)

I understand the problem, and I know you will find my comment a bit
useless, but I find this whole thing pretty complex/noisy. Can we do
better ?

Here is some untested initial proposal:

# When stripping, obey to BR2_STRIP_EXCLUDE_DIRS and
# BR2_STRIP_EXCLUDE_FILES
STRIP_FIND_COMMON_CMD = \
	find $(TARGET_DIR) \
	$(if $(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS)),, \
		\( $(call finddirclauses,$(TARGET_DIR),$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS))) \) -prune -o
	) \
	-not $(call findfileclauses,$(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) \
	-print0

# Regular stripping for everything, except libpthread, ld-*.so and
# kernel modules.
STRIP_FIND_CMD = \
	$(STRIP_FIND_COMMON_CMD) \
	-type f \( -perm /111 -o -name '*.so*' \) \
	-not \( $(call findfileclauses,libpthread*.so* ld-*.so* *.ko) \)

# Special stripping (only debugging symbols) for libpthread and ld-*.so.
STRIP_FIND_SPECIAL_LIBS_CMD = \
	$(STRIP_FIND_COMMON_CMD) \
	\( -name 'ld-*.so*' -o -name 'libpthread*.so*' \)

And then:

	$(STRIP_FIND_CMD) | xargs -0 $(STRIPCMD) 2>/dev/null || true
	$(STRIP_FIND_SPECIAL_LIBS_CMD) | xargs -0 $(STRIPCMD) $(STRIP_STRIP_DEBUG) || true

Thoughts ?

Best regards,

Thomas
-- 
Thomas Petazzoni, CTO, Bootlin (formerly Free Electrons)
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Buildroot] [PATCH v2] Makefile: respect strip exclusions for special libraries
  2018-07-02 20:25     ` Thomas Petazzoni
@ 2018-07-02 21:04       ` Yann E. MORIN
  2018-07-03 10:06       ` [Buildroot] [PATCH v3] " John Keeping
  1 sibling, 0 replies; 8+ messages in thread
From: Yann E. MORIN @ 2018-07-02 21:04 UTC (permalink / raw)
  To: buildroot

Thomas, John, All,

On 2018-07-02 22:25 +0200, Thomas Petazzoni spake thusly:
> [...] I find this whole thing pretty complex/noisy. Can we do
> better ?
> 
> Here is some untested initial proposal:
> 
> # When stripping, obey to BR2_STRIP_EXCLUDE_DIRS and
> # BR2_STRIP_EXCLUDE_FILES
> STRIP_FIND_COMMON_CMD = \
> 	find $(TARGET_DIR) \
> 	$(if $(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS)),, \
> 		\( $(call finddirclauses,$(TARGET_DIR),$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS))) \) -prune -o
> 	) \
> 	-not $(call findfileclauses,$(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) \
> 	-print0
> 
> # Regular stripping for everything, except libpthread, ld-*.so and
> # kernel modules.
> STRIP_FIND_CMD = \
> 	$(STRIP_FIND_COMMON_CMD) \
> 	-type f \( -perm /111 -o -name '*.so*' \) \
> 	-not \( $(call findfileclauses,libpthread*.so* ld-*.so* *.ko) \)
> 
> # Special stripping (only debugging symbols) for libpthread and ld-*.so.
> STRIP_FIND_SPECIAL_LIBS_CMD = \
> 	$(STRIP_FIND_COMMON_CMD) \
> 	\( -name 'ld-*.so*' -o -name 'libpthread*.so*' \)
> 
> And then:
> 
> 	$(STRIP_FIND_CMD) | xargs -0 $(STRIPCMD) 2>/dev/null || true
> 	$(STRIP_FIND_SPECIAL_LIBS_CMD) | xargs -0 $(STRIPCMD) $(STRIP_STRIP_DEBUG) || true
> 
> Thoughts ?

Not tested, but it really looks nice.

Regards,
Yann E. MORIN.

-- 
.-----------------.--------------------.------------------.--------------------.
|  Yann E. MORIN  | Real-Time Embedded | /"\ ASCII RIBBON | Erics' conspiracy: |
| +33 662 376 056 | Software  Designer | \ / CAMPAIGN     |  ___               |
| +33 223 225 172 `------------.-------:  X  AGAINST      |  \e/  There is no  |
| http://ymorin.is-a-geek.org/ | _/*\_ | / \ HTML MAIL    |   v   conspiracy.  |
'------------------------------^-------^------------------^--------------------'

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Buildroot] [PATCH v3] Makefile: respect strip exclusions for special libraries
  2018-07-02 20:25     ` Thomas Petazzoni
  2018-07-02 21:04       ` Yann E. MORIN
@ 2018-07-03 10:06       ` John Keeping
  2018-07-10 15:56         ` Matthew Weber
  2019-02-04 15:57         ` Thomas Petazzoni
  1 sibling, 2 replies; 8+ messages in thread
From: John Keeping @ 2018-07-03 10:06 UTC (permalink / raw)
  To: buildroot

ld-*.so and libpthread*.so* are not stripped in the same way as other
binaries because some applications need symbols in these libraries in
order to operate correctly.

However, the special handling for these binaries ignores the usual
BR2_STRIP_EXCLUDE_* rules so it is not possible to build an image which
has debugging symbols in these binaries.

Pull out the common find functionality so that we can build two find
commands that re-use the common exclusion rules.

Fix-suggested-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
Signed-off-by: John Keeping <john@metanate.com>
---
On Mon, 2 Jul 2018 22:25:16 +0200
Thomas Petazzoni <thomas.petazzoni@bootlin.com> wrote:

> I understand the problem, and I know you will find my comment a bit
> useless, but I find this whole thing pretty complex/noisy. Can we do
> better ?
> 
> Here is some untested initial proposal:
> 
> # When stripping, obey to BR2_STRIP_EXCLUDE_DIRS and
> # BR2_STRIP_EXCLUDE_FILES
> STRIP_FIND_COMMON_CMD = \
> 	find $(TARGET_DIR) \
> 	$(if $(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS)),, \
> 		\( $(call finddirclauses,$(TARGET_DIR),$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS))) \) -prune -o ) \
> 	-not $(call findfileclauses,$(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) \
> 	-print0
> 
> # Regular stripping for everything, except libpthread, ld-*.so and
> # kernel modules.
> STRIP_FIND_CMD = \
> 	$(STRIP_FIND_COMMON_CMD) \
> 	-type f \( -perm /111 -o -name '*.so*' \) \
> 	-not \( $(call findfileclauses,libpthread*.so* ld-*.so* *.ko) \)
> 
> # Special stripping (only debugging symbols) for libpthread and
> ld-*.so. STRIP_FIND_SPECIAL_LIBS_CMD = \
> 	$(STRIP_FIND_COMMON_CMD) \
> 	\( -name 'ld-*.so*' -o -name 'libpthread*.so*' \)
> 
> And then:
> 
> 	$(STRIP_FIND_CMD) | xargs -0 $(STRIPCMD) 2>/dev/null || true
> 	$(STRIP_FIND_SPECIAL_LIBS_CMD) | xargs -0 $(STRIPCMD) $(STRIP_STRIP_DEBUG) || true
> 
> Thoughts ?

This looks much nicer.  I've tested it and fixed a few issues, so we end
up with this patch.


 Makefile | 44 +++++++++++++++++++++++++-------------------
 1 file changed, 25 insertions(+), 19 deletions(-)

diff --git a/Makefile b/Makefile
index 8d25c8a239..ab081412d3 100644
--- a/Makefile
+++ b/Makefile
@@ -591,20 +591,37 @@ RSYNC_VCS_EXCLUSIONS = \
 	--exclude .svn --exclude .git --exclude .hg --exclude .bzr \
 	--exclude CVS
 
-STRIP_FIND_CMD = find $(TARGET_DIR)
-ifneq (,$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS)))
-STRIP_FIND_CMD += \( $(call finddirclauses,$(TARGET_DIR),$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS))) \) -prune -o
-endif
-STRIP_FIND_CMD += -type f \( -perm /111 -o -name '*.so*' \)
-# file exclusions:
+# When stripping, obey to BR2_STRIP_EXCLUDE_DIRS and
+# BR2_STRIP_EXCLUDE_FILES
+STRIP_FIND_COMMON_CMD = \
+	find $(TARGET_DIR) \
+	$(if $(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS)), \
+		\( $(call finddirclauses,$(TARGET_DIR),$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS))) \) \
+		-prune -o \
+	) \
+	$(if $(call qstrip,$(BR2_STRIP_EXCLUDE_FILES)), \
+		-not \( $(call findfileclauses,$(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) )
+
+# Regular stripping for everything, except libpthread, ld-*.so and
+# kernel modules:
 # - libpthread.so: a non-stripped libpthread shared library is needed for
 #   proper debugging of pthread programs using gdb.
 # - ld.so: a non-stripped dynamic linker library is needed for valgrind
 # - kernel modules (*.ko): do not function properly when stripped like normal
 #   applications and libraries. Normally kernel modules are already excluded
 #   by the executable permission check above, so the explicit exclusion is only
 #   done for kernel modules with incorrect permissions.
-STRIP_FIND_CMD += -not \( $(call findfileclauses,libpthread*.so* ld-*.so* *.ko $(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) -print0
+STRIP_FIND_CMD = \
+	$(STRIP_FIND_COMMON_CMD) \
+	-type f \( -perm /111 -o -name '*.so*' \) \
+	-not \( $(call findfileclauses,libpthread*.so* ld-*.so* *.ko) \) \
+	-print0
+
+# Special stripping (only debugging symbols) for libpthread and ld-*.so.
+STRIP_FIND_SPECIAL_LIBS_CMD = \
+	$(STRIP_FIND_COMMON_CMD) \
+	\( -name 'ld-*.so*' -o -name 'libpthread*.so*' \) \
+	-print0
 
 ifeq ($(BR2_ECLIPSE_REGISTER),y)
 define TOOLCHAIN_ECLIPSE_REGISTER
@@ -716,19 +733,8 @@ endif
 	rm -rf $(TARGET_DIR)/usr/share/gtk-doc
 	rmdir $(TARGET_DIR)/usr/share 2>/dev/null || true
 	$(STRIP_FIND_CMD) | xargs -0 $(STRIPCMD) 2>/dev/null || true
+	$(STRIP_FIND_SPECIAL_LIBS_CMD) | xargs -0 -r $(STRIPCMD) $(STRIP_STRIP_DEBUG) 2>/dev/null || true
 
-# See http://sourceware.org/gdb/wiki/FAQ, "GDB does not see any threads
-# besides the one in which crash occurred; or SIGTRAP kills my program when
-# I set a breakpoint"
-ifeq ($(BR2_TOOLCHAIN_HAS_THREADS),y)
-	find $(TARGET_DIR)/lib/ -type f -name 'libpthread*.so*' | \
-		xargs -r $(STRIPCMD) $(STRIP_STRIP_DEBUG)
-endif
-
-# Valgrind needs ld.so with enough information, so only strip
-# debugging symbols.
-	find $(TARGET_DIR)/lib/ -type f -name 'ld-*.so*' | \
-		xargs -r $(STRIPCMD) $(STRIP_STRIP_DEBUG)
 	test -f $(TARGET_DIR)/etc/ld.so.conf && \
 		{ echo "ERROR: we shouldn't have a /etc/ld.so.conf file"; exit 1; } || true
 	test -d $(TARGET_DIR)/etc/ld.so.conf.d && \
-- 
2.18.0

^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [Buildroot] [PATCH v3] Makefile: respect strip exclusions for special libraries
  2018-07-03 10:06       ` [Buildroot] [PATCH v3] " John Keeping
@ 2018-07-10 15:56         ` Matthew Weber
  2019-02-04 15:57         ` Thomas Petazzoni
  1 sibling, 0 replies; 8+ messages in thread
From: Matthew Weber @ 2018-07-10 15:56 UTC (permalink / raw)
  To: buildroot

John,

On Tue, Jul 3, 2018 at 5:06 AM, John Keeping <john@metanate.com> wrote:
> ld-*.so and libpthread*.so* are not stripped in the same way as other
> binaries because some applications need symbols in these libraries in
> order to operate correctly.
>
> However, the special handling for these binaries ignores the usual
> BR2_STRIP_EXCLUDE_* rules so it is not possible to build an image which
> has debugging symbols in these binaries.
>
> Pull out the common find functionality so that we can build two find
> commands that re-use the common exclusion rules.
>
> Fix-suggested-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
> Signed-off-by: John Keeping <john@metanate.com>

I did a test build with a set of folders and files set to exclude.
Plus checked the symbols on the special libs.  Looks ok when checking
stripped vs not.

Tested-by: Matt Weber <matthew.weber@rockwellcollins.com>


> ---
> On Mon, 2 Jul 2018 22:25:16 +0200
> Thomas Petazzoni <thomas.petazzoni@bootlin.com> wrote:
>
>> I understand the problem, and I know you will find my comment a bit
>> useless, but I find this whole thing pretty complex/noisy. Can we do
>> better ?
>>
>> Here is some untested initial proposal:
>>
>> # When stripping, obey to BR2_STRIP_EXCLUDE_DIRS and
>> # BR2_STRIP_EXCLUDE_FILES
>> STRIP_FIND_COMMON_CMD = \
>>       find $(TARGET_DIR) \
>>       $(if $(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS)),, \
>>               \( $(call finddirclauses,$(TARGET_DIR),$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS))) \) -prune -o ) \
>>       -not $(call findfileclauses,$(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) \
>>       -print0
>>
>> # Regular stripping for everything, except libpthread, ld-*.so and
>> # kernel modules.
>> STRIP_FIND_CMD = \
>>       $(STRIP_FIND_COMMON_CMD) \
>>       -type f \( -perm /111 -o -name '*.so*' \) \
>>       -not \( $(call findfileclauses,libpthread*.so* ld-*.so* *.ko) \)
>>
>> # Special stripping (only debugging symbols) for libpthread and
>> ld-*.so. STRIP_FIND_SPECIAL_LIBS_CMD = \
>>       $(STRIP_FIND_COMMON_CMD) \
>>       \( -name 'ld-*.so*' -o -name 'libpthread*.so*' \)
>>
>> And then:
>>
>>       $(STRIP_FIND_CMD) | xargs -0 $(STRIPCMD) 2>/dev/null || true
>>       $(STRIP_FIND_SPECIAL_LIBS_CMD) | xargs -0 $(STRIPCMD) $(STRIP_STRIP_DEBUG) || true
>>
>> Thoughts ?
>
> This looks much nicer.  I've tested it and fixed a few issues, so we end
> up with this patch.
>
>
>  Makefile | 44 +++++++++++++++++++++++++-------------------
>  1 file changed, 25 insertions(+), 19 deletions(-)
>
> diff --git a/Makefile b/Makefile
> index 8d25c8a239..ab081412d3 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -591,20 +591,37 @@ RSYNC_VCS_EXCLUSIONS = \
>         --exclude .svn --exclude .git --exclude .hg --exclude .bzr \
>         --exclude CVS
>
> -STRIP_FIND_CMD = find $(TARGET_DIR)
> -ifneq (,$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS)))
> -STRIP_FIND_CMD += \( $(call finddirclauses,$(TARGET_DIR),$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS))) \) -prune -o
> -endif
> -STRIP_FIND_CMD += -type f \( -perm /111 -o -name '*.so*' \)
> -# file exclusions:
> +# When stripping, obey to BR2_STRIP_EXCLUDE_DIRS and
> +# BR2_STRIP_EXCLUDE_FILES
> +STRIP_FIND_COMMON_CMD = \
> +       find $(TARGET_DIR) \
> +       $(if $(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS)), \
> +               \( $(call finddirclauses,$(TARGET_DIR),$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS))) \) \
> +               -prune -o \
> +       ) \
> +       $(if $(call qstrip,$(BR2_STRIP_EXCLUDE_FILES)), \
> +               -not \( $(call findfileclauses,$(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) )
> +
> +# Regular stripping for everything, except libpthread, ld-*.so and
> +# kernel modules:
>  # - libpthread.so: a non-stripped libpthread shared library is needed for
>  #   proper debugging of pthread programs using gdb.
>  # - ld.so: a non-stripped dynamic linker library is needed for valgrind
>  # - kernel modules (*.ko): do not function properly when stripped like normal
>  #   applications and libraries. Normally kernel modules are already excluded
>  #   by the executable permission check above, so the explicit exclusion is only
>  #   done for kernel modules with incorrect permissions.
> -STRIP_FIND_CMD += -not \( $(call findfileclauses,libpthread*.so* ld-*.so* *.ko $(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) -print0
> +STRIP_FIND_CMD = \
> +       $(STRIP_FIND_COMMON_CMD) \
> +       -type f \( -perm /111 -o -name '*.so*' \) \
> +       -not \( $(call findfileclauses,libpthread*.so* ld-*.so* *.ko) \) \
> +       -print0
> +
> +# Special stripping (only debugging symbols) for libpthread and ld-*.so.
> +STRIP_FIND_SPECIAL_LIBS_CMD = \
> +       $(STRIP_FIND_COMMON_CMD) \
> +       \( -name 'ld-*.so*' -o -name 'libpthread*.so*' \) \
> +       -print0
>
>  ifeq ($(BR2_ECLIPSE_REGISTER),y)
>  define TOOLCHAIN_ECLIPSE_REGISTER
> @@ -716,19 +733,8 @@ endif
>         rm -rf $(TARGET_DIR)/usr/share/gtk-doc
>         rmdir $(TARGET_DIR)/usr/share 2>/dev/null || true
>         $(STRIP_FIND_CMD) | xargs -0 $(STRIPCMD) 2>/dev/null || true
> +       $(STRIP_FIND_SPECIAL_LIBS_CMD) | xargs -0 -r $(STRIPCMD) $(STRIP_STRIP_DEBUG) 2>/dev/null || true
>
> -# See http://sourceware.org/gdb/wiki/FAQ, "GDB does not see any threads
> -# besides the one in which crash occurred; or SIGTRAP kills my program when
> -# I set a breakpoint"
> -ifeq ($(BR2_TOOLCHAIN_HAS_THREADS),y)
> -       find $(TARGET_DIR)/lib/ -type f -name 'libpthread*.so*' | \
> -               xargs -r $(STRIPCMD) $(STRIP_STRIP_DEBUG)
> -endif
> -
> -# Valgrind needs ld.so with enough information, so only strip
> -# debugging symbols.
> -       find $(TARGET_DIR)/lib/ -type f -name 'ld-*.so*' | \
> -               xargs -r $(STRIPCMD) $(STRIP_STRIP_DEBUG)
>         test -f $(TARGET_DIR)/etc/ld.so.conf && \
>                 { echo "ERROR: we shouldn't have a /etc/ld.so.conf file"; exit 1; } || true
>         test -d $(TARGET_DIR)/etc/ld.so.conf.d && \
> --
> 2.18.0
>
> _______________________________________________
> buildroot mailing list
> buildroot at busybox.net
> http://lists.busybox.net/mailman/listinfo/buildroot



-- 
Matthew L Weber / Pr Software Engineer
Airborne Information Systems / RC Linux Secure Platforms
MS 131-100, C Ave NE, Cedar Rapids, IA, 52498, USA
www.rockwellcollins.com

Note: Any Export License Required Information and License Restricted
Third Party Intellectual Property (TPIP) content must be encrypted and
sent to matthew.weber at corp.rockwellcollins.com.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* [Buildroot] [PATCH v3] Makefile: respect strip exclusions for special libraries
  2018-07-03 10:06       ` [Buildroot] [PATCH v3] " John Keeping
  2018-07-10 15:56         ` Matthew Weber
@ 2019-02-04 15:57         ` Thomas Petazzoni
  1 sibling, 0 replies; 8+ messages in thread
From: Thomas Petazzoni @ 2019-02-04 15:57 UTC (permalink / raw)
  To: buildroot

Hello,

On Tue, 3 Jul 2018 11:06:14 +0100
John Keeping <john@metanate.com> wrote:

> ld-*.so and libpthread*.so* are not stripped in the same way as other
> binaries because some applications need symbols in these libraries in
> order to operate correctly.
> 
> However, the special handling for these binaries ignores the usual
> BR2_STRIP_EXCLUDE_* rules so it is not possible to build an image which
> has debugging symbols in these binaries.
> 
> Pull out the common find functionality so that we can build two find
> commands that re-use the common exclusion rules.
> 
> Fix-suggested-by: Thomas Petazzoni <thomas.petazzoni@bootlin.com>
> Signed-off-by: John Keeping <john@metanate.com>

I've applied to master, with a very minor change (see below).

> -STRIP_FIND_CMD = find $(TARGET_DIR)
> -ifneq (,$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS)))
> -STRIP_FIND_CMD += \( $(call finddirclauses,$(TARGET_DIR),$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS))) \) -prune -o
> -endif
> -STRIP_FIND_CMD += -type f \( -perm /111 -o -name '*.so*' \)

So the permission check used to be here.

> -# file exclusions:
> +# When stripping, obey to BR2_STRIP_EXCLUDE_DIRS and
> +# BR2_STRIP_EXCLUDE_FILES
> +STRIP_FIND_COMMON_CMD = \
> +	find $(TARGET_DIR) \
> +	$(if $(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS)), \
> +		\( $(call finddirclauses,$(TARGET_DIR),$(call qstrip,$(BR2_STRIP_EXCLUDE_DIRS))) \) \
> +		-prune -o \
> +	) \
> +	$(if $(call qstrip,$(BR2_STRIP_EXCLUDE_FILES)), \
> +		-not \( $(call findfileclauses,$(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) )
> +
> +# Regular stripping for everything, except libpthread, ld-*.so and
> +# kernel modules:
>  # - libpthread.so: a non-stripped libpthread shared library is needed for
>  #   proper debugging of pthread programs using gdb.
>  # - ld.so: a non-stripped dynamic linker library is needed for valgrind
>  # - kernel modules (*.ko): do not function properly when stripped like normal
>  #   applications and libraries. Normally kernel modules are already excluded
>  #   by the executable permission check above, so the explicit exclusion is only

... but it's not below that comment so the "executable permission check
above" is no longer true. I just deleted the "above" :)

>  #   done for kernel modules with incorrect permissions.
> -STRIP_FIND_CMD += -not \( $(call findfileclauses,libpthread*.so* ld-*.so* *.ko $(call qstrip,$(BR2_STRIP_EXCLUDE_FILES))) \) -print0
> +STRIP_FIND_CMD = \
> +	$(STRIP_FIND_COMMON_CMD) \
> +	-type f \( -perm /111 -o -name '*.so*' \) \

The executable permission check is now here.

Thanks a lot!

Thomas
-- 
Thomas Petazzoni, CTO, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2019-02-04 15:57 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-07-02 16:00 [Buildroot] [PATCH] Makefile: respect strip exclusions for special libraries John Keeping
2018-07-02 16:40 ` Yann E. MORIN
2018-07-02 16:57   ` [Buildroot] [PATCH v2] " John Keeping
2018-07-02 20:25     ` Thomas Petazzoni
2018-07-02 21:04       ` Yann E. MORIN
2018-07-03 10:06       ` [Buildroot] [PATCH v3] " John Keeping
2018-07-10 15:56         ` Matthew Weber
2019-02-04 15:57         ` Thomas Petazzoni

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.