From mboxrd@z Thu Jan 1 00:00:00 1970 X-Msuck: nntp://news.gmane.org/gmane.linux.lib.musl.general/5883 Path: news.gmane.org!not-for-mail From: Natanael Copa Newsgroups: gmane.linux.lib.musl.general Subject: the definition of (u)int64_t with gcc -m32 in stdint.h Date: Thu, 21 Aug 2014 17:15:11 +0200 Message-ID: <20140821171511.06869699@ncopa-desktop.alpinelinux.org> Reply-To: musl@lists.openwall.com NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: 7bit X-Trace: ger.gmane.org 1408634149 6916 80.91.229.3 (21 Aug 2014 15:15:49 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Thu, 21 Aug 2014 15:15:49 +0000 (UTC) To: musl@lists.openwall.com Original-X-From: musl-return-5889-gllmg-musl=m.gmane.org@lists.openwall.com Thu Aug 21 17:15:42 2014 Return-path: Envelope-to: gllmg-musl@plane.gmane.org Original-Received: from mother.openwall.net ([195.42.179.200]) by plane.gmane.org with smtp (Exim 4.69) (envelope-from ) id 1XKU5L-0002m5-Sf for gllmg-musl@plane.gmane.org; Thu, 21 Aug 2014 17:15:31 +0200 Original-Received: (qmail 30422 invoked by uid 550); 21 Aug 2014 15:15:30 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Original-Received: (qmail 30414 invoked from network); 21 Aug 2014 15:15:29 -0000 X-Mailer: Claws Mail 3.10.1 (GTK+ 2.24.23; x86_64-alpine-linux-musl) Xref: news.gmane.org gmane.linux.lib.musl.general:5883 Archived-At: Hi, After migrating from uclibc to musl libc the Xen hvmloader broke. This is a 32bit bootloader that is built on 64 bit hosts with gcc -m32. Someone told me breakage had to do with datastructs beeing 64 bit even with -m32. I also saw someone comment that it shoudl been built with -nostdinc. I tried this and it revealed that yes, indeed, the hvmloader does use the host system stdint.h and stdarg.h. Curious on why it works on uclibc but not with musl i found out that uclibc/glibc sets (u)int64_t depening on __WORDSIZE: # if __WORDSIZE == 64 typedef long int int64_t; # else __extension__ typedef long long int int64_t; # endif and wordsize is set in /usr/include/bits/wordsize.h: /* Determine the wordsize from the preprocessor defines. */ #if defined __x86_64__ # define __WORDSIZE 64 /* This makes /var/run/utmp compatible with 32-bit environment: */ # define __WORDSIZE_COMPAT32 1 #else # define __WORDSIZE 32 #endif the __x86_64__ define is set by gcc and is set differently when -m32 is specified or not. A testcase. On uclibc 64 bit host: dev-2-7-x86_64:~$ echo '#include ' | gcc -m32 -E - | grep int64 typedef long long int int64_t; typedef unsigned long long int uint64_t; Same on musl libc 64 bit host: $ echo '#include ' | gcc -m32 -E - | grep int64 typedef long int64_t; typedef unsigned long uint64_t; typedef int64_t int_fast64_t; typedef int64_t int_least64_t; typedef uint64_t uint_fast64_t; typedef uint64_t uint_least64_t; so on musl it is 'long' but on uclibc its 'long long int'. That explains why it works on uclibc but not on musl. Now, what is the proper way to fix it? Preferible without replacing all (u)int*_t all places in xen code. I doubt upstream will accept that. -nc