Subject: Re: newvers.sh padding problem
To: Charles M. Hannum <root@ihack.net>
From: Richard Earnshaw <rearnsha@arm.com>
List: tech-kern
Date: 02/01/1999 11:46:16
> 
> BTW, note that with Curt's change, libkvm, kvm_mkdb(8) and savecore(8)
> (and anything else that reads the version string out of the kernel)
> would all have to be changed, because the `version' symbol would now
> point to the address of the string.  This is kind of a PITA for
> upgrade purposes.
> 


I've just had a quick look at what the compiler/assembler were generating.

If the sccs variable is initialized from a set of quoted chars, then the 
compiler doesn't put out any alignment directive.  If however, it is 
initialized from a string, then the string is aligned first.   The effect 
is that the sccs variable is not aligned, but the version variable is, so 
on the ARM (which aligns string constants) we get

vers.c

char ostype[] = "NetBSD";
char osrelease[] = "1.3I";
char sccs[8] = { ' ', ' ', ' ', ' ', '@', '(', '#', ')' };
char version[] =     "NetBSD 1.3I (SHARK) #8: Mon Jan 11 15:05:18 GMT 
1999\n
rearnsha@shark1:/work/rearnsha/netbsd/sys/arch/arm32/compile/SHARK\n";

which compiles to 

Disassembly of section .data:

00000000 <_ostype>:
   0:   4274654e
   4:   00004453

00000008 <_osrelease>:
   8:   49332e31
        ...

0000000d <_sccs>:		<---------- NOT ALIGNED
   d:   20202020
  11:   29232840
  15:   4e000000		<---------- 3 bytes of padding

00000018 <_version>:		<---------- ALIGNED
  18:   4274654e
  1c:   31204453

but changing vers.c to

char ostype[] = "NetBSD";
char osrelease[] = "1.3I";
char sccs[8] = "    @(#)";
char version[] =     "NetBSD 1.3I (SHARK) #8: Mon Jan 11 15:05:18 GMT 
1999\n    rearnsha@shark1:/work/rearnsha/netbsd/sys/arch/arm32/compile/SHAR
K\n";

which compiles to

Disassembly of section .data:

00000000 <_ostype>:
   0:   4274654e
   4:   00004453

00000008 <_osrelease>:
   8:   49332e31
   c:   00000000

00000010 <_sccs>:		<----------- NOW ALIGNED
  10:   20202020
  14:   29232840

00000018 <_version>:
  18:   4274654e
  1c:   31204453


Of course, if any platform aligns strings to a 16 byte boundary, then the 
sccs variable should be made 16 bytes long, with additional front padding.

Final note (probably stating the obvious), the size of the sccs variable 
must be bounded to prevent \0 termination.

R.

PS.  Why aren't these const char arrays?