Mark Kettenis <mark.kette...@xs4all.nl> writes: > This one is tricky. The bison skeleton code uses malloc(3) and > free(3), and tries to make sure a prototype for those functions is in > scope. It attempts to detect if <stdlib.h> has been included, and if > not, provides its own prototypes. The detection code checks if > _STDLIB_H has been defined. However, the BSD stdlib.h uses _STDLIB_H_ > (note the trailing underscore). So the check fails and a typically > redundant prototype will be provided. Usually this only produces a > compiler warning. However... > > The multimedia/libaacs port has a > > #pragma GCC visibility push(hidden) > > in its parser code. Since the malloc and free prototypes appear after > that pragma, it means they get marked as hidden symbols. This makes > the compiler generate R_X86_64_PC32 relocations that binutils 2.17 > doesn't like. > > Here is a simple fix that simply replaces _STDLIB_H with _STDLIB_H_ in > the skeleton code. Newer bison versions take a slightly different > approach and check whether EXIT_SUCCESS has been defined.
Maybe I'm nitpicking here, but that would mean that parsers generated by the OpenBSD bison package may now misbehave on systems where _STDLIB_H is provided. I know that our bison package is old, people should probably not use it, but maybe there's another way to deal with this? I think that this #ifdef _STDLIB_H maze would be enough with the following tweak. I see no reason for C++ to be a special case here. The resulting libaacs parser *still depends on stdlib.h being included earlier in the .y*, but at least the _STDLIB_H guards are working and prevent the local decls. Thoughts? Index: Makefile =================================================================== RCS file: /cvs/ports/devel/bison/Makefile,v retrieving revision 1.50 diff -u -p -r1.50 Makefile --- Makefile 9 Nov 2013 23:19:02 -0000 1.50 +++ Makefile 18 May 2015 11:02:39 -0000 @@ -3,7 +3,7 @@ COMMENT= GNU parser generator DISTNAME= bison-2.3 -REVISION= 1 +REVISION= 2 CATEGORIES= devel MASTER_SITES= ${MASTER_SITE_GNU:=bison/} Index: patches/patch-data_yacc_c =================================================================== RCS file: patches/patch-data_yacc_c diff -N patches/patch-data_yacc_c --- /dev/null 1 Jan 1970 00:00:00 -0000 +++ patches/patch-data_yacc_c 18 May 2015 11:02:39 -0000 @@ -0,0 +1,12 @@ +$OpenBSD$ +--- data/yacc.c.orig Mon May 18 12:04:31 2015 ++++ data/yacc.c Mon May 18 13:01:54 2015 +@@ -333,7 +333,7 @@ typedef short int yytype_int16; + # ifndef YYSTACK_ALLOC_MAXIMUM + # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM + # endif +-# if (defined __cplusplus && ! defined _STDLIB_H \ ++# if (! defined _STDLIB_H \ + && ! ((defined YYMALLOC || defined malloc) \ + && (defined YYFREE || defined free))) + # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */ -- jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE