Re: [PATCH] Fix building kernel under Solaris 11_snv

From: Jan Engelhardt
Date: Fri Mar 09 2007 - 15:21:14 EST



On Mar 9 2007 20:00, Sam Ravnborg wrote:
>On Thu, Mar 08, 2007 at 11:01:57PM +0100, Jan Engelhardt wrote:
>>
>> Since Solaris seems to be on the run, I did myself try compile it.
>> However, unlike the original poster who said he did so on SunOS 4.8, I
>> did it on 5.11_snv39, yielding a bigger changeset. I thought I just
>> share the diff that piled up so far. It needs a lot of hacks on the
>> Solaris side - prioritizing GNU names, then, second, gnu ld has a
>> glitch, then, gcc has a missing file... it's fun fun fun!
>
>Can I please have a signed-off version of this patch.

_Are you sure_ you want all these hacks without further
review from other people? Also note the patch is incomplete,
for example I could not compile the acpi pieces because
acsolaris.h -- which is referenced in the acpi includes --
does not exist. (Yet another piece of software that has
crossplatform compatibilty stuff, like XFS.)

>> --- linux-2.6.21-rc3.orig/include/linux/input.h 2007-03-07 05:41:20.000000000 +0100
>> +++ linux-2.6.21-rc3/include/linux/input.h 2007-03-07 23:40:39.417339000 +0100
>> @@ -16,7 +16,9 @@
>> #include <sys/time.h>
>> #include <sys/ioctl.h>
>> #include <sys/types.h>
>> -#include <asm/types.h>
>> +#ifndef __sun__
>> +# include <asm/types.h>
>> +#endif
>> #endif

This is not a proper fix for sure. The problem lies in
file2alias.c, see (your own) http://lkml.org/lkml/2007/3/8/339

>> Index: linux-2.6.21-rc3/scripts/genksyms/genksyms.c
>> ===================================================================
>> --- linux-2.6.21-rc3.orig/scripts/genksyms/genksyms.c 2007-03-07 05:41:20.000000000 +0100
>> +++ linux-2.6.21-rc3/scripts/genksyms/genksyms.c 2007-03-07 23:28:35.659555000 +0100
>> @@ -21,6 +21,7 @@
>> along with this program; if not, write to the Free Software Foundation,
>> Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
>>
>> +#include <alloca.h>
>> #include <stdio.h>
>> #include <string.h>
>> #include <stdlib.h>

This is however, is valid. Can I gave sign-offs for single hunks?

>> Index: linux-2.6.21-rc3/scripts/kallsyms.c
>> ===================================================================
>> --- linux-2.6.21-rc3.orig/scripts/kallsyms.c 2007-03-07 05:41:20.000000000 +0100
>> +++ linux-2.6.21-rc3/scripts/kallsyms.c 2007-03-07 23:46:46.249005000 +0100
>> @@ -378,6 +378,40 @@
>> table_cnt = pos;
>> }
>>
>> +#ifdef __sun__
>> +/* Return the first occurrence of NEEDLE in HAYSTACK. */
>> +void *
>> +memmem (haystack, haystack_len, needle, needle_len)
>> + const void *haystack;
>> + size_t haystack_len;
>> + const void *needle;
>> + size_t needle_len;
>> +{
>> + const char *begin;
>> + const char *const last_possible
>> + = (const char *) haystack + haystack_len - needle_len;
>> +
>> + if (needle_len == 0)
>> + /* The first occurrence of the empty string is deemed to occur at
>> + the beginning of the string. */
>> + return (void *) haystack;
>> +
>> + /* Sanity check, otherwise the loop might search through the whole
>> + memory. */
>> + if (__builtin_expect (haystack_len < needle_len, 0))
>> + return NULL;
>> +
>> + for (begin = (const char *) haystack; begin <= last_possible; ++begin)
>> + if (begin[0] == ((const char *) needle)[0] &&
>> + !memcmp ((const void *) &begin[1],
>> + (const void *) ((const char *) needle + 1),
>> + needle_len - 1))
>> + return (void *) begin;
>> +
>> + return NULL;
>> +}
>> +#endif
>> +
>> /* replace a given token in all the valid symbols. Use the sampled symbols
>> * to update the counts */
>> static void compress_symbols(unsigned char *str, int idx)

This one, I am just waiting for someone to object to the extra #if-#endif.

>> Index: linux-2.6.21-rc3/scripts/kconfig/Makefile
>> ===================================================================
>> --- linux-2.6.21-rc3.orig/scripts/kconfig/Makefile 2007-03-07 05:41:20.000000000 +0100
>> +++ linux-2.6.21-rc3/scripts/kconfig/Makefile 2007-03-07 23:21:19.730679000 +0100
>> @@ -88,7 +88,7 @@
>> HOST_EXTRACFLAGS = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ccflags)
>> HOST_LOADLIBES = $(shell $(CONFIG_SHELL) $(check-lxdialog) -ldflags $(HOSTCC))
>>
>> -HOST_EXTRACFLAGS += -DLOCALE
>> +HOST_EXTRACFLAGS += -DLOCALE -std=c99 -D__EXTENSIONS__
>>
>> PHONY += $(obj)/dochecklxdialog
>> $(obj)/dochecklxdialog:

The error message for this one was: <stdbool.h> only valid in C99 mode.
Linux GCC 4.1.2 does not print that, Solaris GCC 3.4.3 does. I do not
know offhand who is right.

>> Index: linux-2.6.21-rc3/scripts/kconfig/lxdialog/dialog.h
>> ===================================================================
>> --- linux-2.6.21-rc3.orig/scripts/kconfig/lxdialog/dialog.h 2007-03-07 05:41:20.000000000 +0100
>> +++ linux-2.6.21-rc3/scripts/kconfig/lxdialog/dialog.h 2007-03-07 23:14:48.462956000 +0100
>> @@ -222,3 +222,7 @@
>> * -- uppercase chars are used to invoke the button (M_EVENT + 'O')
>> */
>> #define M_EVENT (KEY_MAX+1)
>> +
>> +#ifndef KEY_RESIZE
>> +# define KEY_RESIZE 0632
>> +#endif

Solaris only has curses, not ncurses. Consider this a supreme hack.
In fact, menuconfig has some weird display errors still.

>> Index: linux-2.6.21-rc3/scripts/mod/file2alias.c
>> ===================================================================
>> --- linux-2.6.21-rc3.orig/scripts/mod/file2alias.c 2007-03-07 05:41:20.000000000 +0100
>> +++ linux-2.6.21-rc3/scripts/mod/file2alias.c 2007-03-07 23:41:23.772026000 +0100
>> @@ -32,6 +32,8 @@
>> typedef uint32_t __u32;
>> typedef uint16_t __u16;
>> typedef unsigned char __u8;
>> +typedef int32_t __s32;
>> +typedef int16_t __s16;
>>
>> /* Big exception to the "don't include kernel headers into userspace, which
>> * even potentially has different endianness and word sizes, since

HAX.

>> Index: linux-2.6.21-rc3/scripts/mod/modpost.h
>> ===================================================================
>> --- linux-2.6.21-rc3.orig/scripts/mod/modpost.h 2007-03-07 05:41:20.000000000 +0100
>> +++ linux-2.6.21-rc3/scripts/mod/modpost.h 2007-03-07 23:37:01.315290000 +0100
>> @@ -41,6 +41,11 @@
>> #define ELF_R_TYPE ELF64_R_TYPE
>> #endif
>>
>> +#ifdef __sun__
>> +typedef uint16_t Elf32_Section;
>> +typedef uint16_t Elf64_Section;
>> +#endif
>> +
>> /* The 64-bit MIPS ELF ABI uses an unusual reloc format. */
>> typedef struct
>> {

More HAX because Sol does not have them >:-(

>> Index: linux-2.6.21-rc3/scripts/mod/sumversion.c
>> ===================================================================
>> --- linux-2.6.21-rc3.orig/scripts/mod/sumversion.c 2007-03-07 05:41:20.000000000 +0100
>> +++ linux-2.6.21-rc3/scripts/mod/sumversion.c 2007-03-07 23:43:55.668334000 +0100
>> @@ -6,6 +6,7 @@
>> #endif
>> #include <ctype.h>
>> #include <errno.h>
>> +#include <limits.h>
>> #include <string.h>
>> #include "modpost.h"
>>

Valid hunk, should be applied (to get the PATH_MAX constant).

>> @@ -417,7 +418,8 @@
>> *end = '\0';
>>
>> md4_init(&md);
>> - while ((fname = strsep(&sources, " ")) != NULL) {
>> + for(fname = strtok(sources, " "); fname != NULL;
>> + fname = strtok(NULL, " ")) {
>> if (!*fname)
>> continue;
>> if (!parse_source_files(fname, &md))
>> #<EOF>

See thread debate as to whether to keep strsep or use
strtok, since strtok is not thread-safe, and strtok_r
is a GNUism unlikely to be available in Solaris either.


Jan
--
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/