[PATCH v2] Reinstate hidden protos for config_{open,close,read}()

Vineet Gupta Vineet.Gupta1 at synopsys.com
Tue May 7 04:30:31 UTC 2013


Partially reverts "parser_config.[ch]: remove duplicated hidden functions"

There's a namespace collision for config_{open,close,read} functions
between uClibc and Busybox. Callers in uClibc and busybox need to call
their local variants. In case of static linking, both the variants need
to be pulled in the final executable.

Turns out that the existing hidden attribute is not enough for static
linked Busybox where the linker treats these symbols as duplicate and
pulls in only the local (Busybox's own) variants in the final link.
This obviously causes the uClibc callers to crap out at runtime.

This can be fixed by restoring the libc_hidden_proto() annotation
which causes the libc variants to be aliased with __GI_ prefix thus
making both the symbols distinct from linker's perspective.

This issue was found with ARC gcc 4.8 + uClibc trunk.
I can confirm the same thing with ARM uClibc buildroot build (when
switching to uClibc daily snapshot).

All the credit for debugging the issue goes to Anton,Joern and Jeremy -
I simply found the cure :-)

Signed-off-by: Vineet Gupta <vgupta at synopsys.com>
Cc: Anton Kolesov <akolesov at synopsys.com>
Cc: Jeremy Bennett <jeremy.bennett at embecosm.com>
Cc: Joern Rennecke <joern.rennecke at embecosm.com>
Cc: Bernhard Reutner-Fischer <rep.dot.nop at gmail.com>
Cc: Peter S. Mazinger <ps.m at gmx.net>
---
 include/internal/parse_config.h |    3 +++
 1 file changed, 3 insertions(+)

diff --git a/include/internal/parse_config.h b/include/internal/parse_config.h
index 69be0cb..ebfb87e 100644
--- a/include/internal/parse_config.h
+++ b/include/internal/parse_config.h
@@ -46,9 +46,12 @@ typedef struct parser_t {
 } parser_t;
 
 parser_t* config_open(const char *filename) FAST_FUNC attribute_hidden;
+libc_hidden_proto(config_open)
 int config_read(parser_t *parser, char ***tokens, unsigned flags, const char *delims) FAST_FUNC attribute_hidden;
+libc_hidden_proto(config_read)
 #define config_read(parser, tokens, max, min, str, flags) \
 	config_read(parser, tokens, ((flags) | (((min) & 0xFF) << 8) | ((max) & 0xFF)), str)
 void config_close(parser_t *parser) FAST_FUNC attribute_hidden;
+libc_hidden_proto(config_close)
 
 #endif /* __INTERNAL_PARSE_CONFIG_H */
-- 
1.7.10.4



More information about the uClibc mailing list