15941179 coreutils "gmake test" failures
18744372 GNU coreutils stdbuf line buffering is broken.
--- a/components/coreutils/Makefile Tue May 13 10:00:55 2014 -0700
+++ b/components/coreutils/Makefile Wed May 14 12:19:10 2014 -0700
@@ -65,8 +65,6 @@
# Get the binaries to test from the component proto area.
COMPONENT_TEST_ENV += PATH=$(PROTOUSRSBINDIR):/usr/bin
-# There is one known test failure:
-# misc/stdbuf - see CR #15941179
test: install $(TEST_64)
BUILD_PKG_DEPENDENCIES = $(BUILD_TOOLS)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/components/coreutils/patches/libstdbuf.c.patch Wed May 14 12:19:10 2014 -0700
@@ -0,0 +1,22 @@
+Changes needed to properly create the libstdbuf.so shared library on Solaris.
+
+This change has been passed upstream.
+
+--- coreutils-8.16/src/libstdbuf.c.orig 2014-05-08 21:41:23.436563716 -0700
++++ coreutils-8.16/src/libstdbuf.c 2014-05-12 17:44:17.575294603 -0700
+@@ -127,7 +127,14 @@
+ }
+ }
+
+-__attribute__ ((constructor)) static void
++#if (__GNUC__ >= 3 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 7) \
++ || 0x590 <= __SUNPRO_C)
++/* Explicitly define to avoid otherwise elided __attribute on SUNPRO_C */
++# define ATTRIBUTE_CONSTRUCTOR __attribute ((constructor))
++#else
++# error "__attribute ((constructor)) support is required"
++#endif
++static void ATTRIBUTE_CONSTRUCTOR
+ stdbuf (void)
+ {
+ char *e_mode = getenv ("_STDBUF_E");
--- a/components/coreutils/patches/stdbuf.c.patch Tue May 13 10:00:55 2014 -0700
+++ b/components/coreutils/patches/stdbuf.c.patch Wed May 14 12:19:10 2014 -0700
@@ -1,50 +1,22 @@
-Changes needed to get stdbuf to successfully preload libstdbuf.so
-for both 32-bit and 64-bit applications. See comment in the patch
-for more details.
+Change needed to get stdbuf to successfully preload libstdbuf.so
+for both 32-bit and 64-bit applications.
+
+This change has been passed upstream.
---- coreutils-8.16/src/stdbuf.c.orig 2013-09-04 19:05:35.225857588 -0700
-+++ coreutils-8.16/src/stdbuf.c 2013-09-04 19:11:51.945113130 -0700
-@@ -195,37 +195,13 @@
- gcc stdbuf.c -Wl,-rpath,'$ORIGIN' -Wl,-rpath,$PKGLIBEXECDIR
- However we want the lookup done for the exec'd command not stdbuf.
-
-- Since we don't link against libstdbuf.so add it to PKGLIBEXECDIR
-- rather than to LIBDIR. */
-- char const *const search_path[] = {
-- program_path,
-- PKGLIBEXECDIR,
-- NULL
-- };
-+ Since we don't link against libstdbuf.so, we need to LD_PRELOAD it.
-+ As libstdbuf.so lives in /usr/lib and /usr/lib/64, we just use
-+ LD_PRELOAD=libstdbuf.so, and ld.so.1 finds the right one associated
-+ with the process class. ie. we don't use full path names for the
-+ preload names. */
+--- coreutils-8.16/src/stdbuf.c.orig 2014-05-12 13:48:24.644347899 -0700
++++ coreutils-8.16/src/stdbuf.c 2014-05-14 09:45:52.507614923 -0700
+@@ -200,6 +200,14 @@
+ char const *const search_path[] = {
+ program_path,
+ PKGLIBEXECDIR,
++
++ /* Since we don't link against libstdbuf.so, we need to LD_PRELOAD it.
++ libstdbuf.so lives in /usr/lib and /usr/lib/64, so we just use a
++ search path value of "" and that equates to LD_PRELOAD=libstdbuf.so,
++ and ld.so.1 finds the right one associated with the process class.
++ ie. we don't use full path names for the preload names. */
++
++ "", /* System default */
+ NULL
+ };
-- char const *const *path = search_path;
-- char *libstdbuf;
--
-- while (true)
-- {
-- struct stat sb;
--
-- if (!**path) /* system default */
-- {
-- libstdbuf = xstrdup (LIB_NAME);
-- break;
-- }
-- ret = asprintf (&libstdbuf, "%s/%s", *path, LIB_NAME);
-- if (ret < 0)
-- xalloc_die ();
-- if (stat (libstdbuf, &sb) == 0) /* file_exists */
-- break;
-- free (libstdbuf);
--
-- ++path;
-- if ( ! *path)
-- error (EXIT_CANCELED, 0, _("failed to find %s"), quote (LIB_NAME));
-- }
-+ char *libstdbuf = xstrdup (LIB_NAME);
-
- /* FIXME: Do we need to support libstdbuf.dll, c:, '\' separators etc? */
-