From: Rob Landley Date: Tue, 29 Aug 2006 21:46:10 +0000 (-0000) Subject: There's some strange bug in glibc that triggers if you combine the X-Git-Tag: 1_4_0~777 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=1fdd83f8979cff7875de53dfa3f99bd7d9ac838d;p=platform%2Fupstream%2Fbusybox.git There's some strange bug in glibc that triggers if you combine the --gc-sections linker flag with static linking. If this happens, then the "stdout" variable (used by printf() and such) will only work if stdout is _not_ redirected. I.E "./busybox" prints stuff, but "./busybox | cat" does not produce any output. (But even when redirected, "write(1,"blah",4);" continues to work just fine.) This is clearly a glibc bug, but to avoid triggering it I've moved the --gc-sections flag so it only gets added when we're not statically linking. If somebody would like to go poke Ulrich Drepper, you can trivially reproduce this with a "hello world" program, ala: gcc -static -Wl,--gc-sections hello.c && (./a.out | cat) --- diff --git a/Rules.mak b/Rules.mak index a99d42b..e4ac817 100644 --- a/Rules.mak +++ b/Rules.mak @@ -267,8 +267,6 @@ ifeq ($(strip $(CONFIG_DEBUG)),y) CFLAGS +=-g else CFLAGS +=-DNDEBUG - CHECKED_LDFLAGS += $(call check_ld,$(LD),--sort-common,) - CHECKED_LDFLAGS += $(call check_ld,$(LD),--gc-sections,) endif ifneq ($(strip $(CONFIG_DEBUG_PESSIMIZE)),y) @@ -288,6 +286,11 @@ endif STRIPCMD:=$(call check_strip,$(STRIP),-s --remove-section=.note --remove-section=.comment,$(STRIP)) ifeq ($(strip $(CONFIG_STATIC)),y) PROG_CFLAGS += $(call check_cc,$(CC),-static,) +else + ifneq ($(strip $(CONFIG_DEBUG)),y) + CHECKED_LDFLAGS += $(call check_ld,$(LD),--sort-common,) + CHECKED_LDFLAGS += $(call check_ld,$(LD),--gc-sections,) + endif endif CFLAGS_SHARED := $(call check_cc,$(CC),-shared,) LIB_CFLAGS+=$(CFLAGS_SHARED)