<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="it">
	<id>https://lugman.org/index.php?action=history&amp;feed=atom&amp;title=Sysenter%2Fsysexit_VS_int_%240x80</id>
	<title>Sysenter/sysexit VS int $0x80 - Cronologia</title>
	<link rel="self" type="application/atom+xml" href="https://lugman.org/index.php?action=history&amp;feed=atom&amp;title=Sysenter%2Fsysexit_VS_int_%240x80"/>
	<link rel="alternate" type="text/html" href="https://lugman.org/index.php?title=Sysenter/sysexit_VS_int_$0x80&amp;action=history"/>
	<updated>2026-05-05T08:43:49Z</updated>
	<subtitle>Cronologia della pagina su questo sito</subtitle>
	<generator>MediaWiki 1.43.3</generator>
	<entry>
		<id>https://lugman.org/index.php?title=Sysenter/sysexit_VS_int_$0x80&amp;diff=132&amp;oldid=prev</id>
		<title>Fausto: Creata pagina con &quot;In un sistema Linux x86 (quindi a 32bit) le chiamate di sistema vengono fatte storicamente avvalendosi dell&#039;istruzione &#039;&#039;INT 80h&#039;&#039;. Questo interrupt è un interrupt di tipo so...&quot;</title>
		<link rel="alternate" type="text/html" href="https://lugman.org/index.php?title=Sysenter/sysexit_VS_int_$0x80&amp;diff=132&amp;oldid=prev"/>
		<updated>2013-10-06T07:37:12Z</updated>

		<summary type="html">&lt;p&gt;Creata pagina con &amp;quot;In un sistema Linux x86 (quindi a 32bit) le chiamate di sistema vengono fatte storicamente avvalendosi dell&amp;#039;istruzione &amp;#039;&amp;#039;INT 80h&amp;#039;&amp;#039;. Questo interrupt è un interrupt di tipo so...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nuova pagina&lt;/b&gt;&lt;/p&gt;&lt;div&gt;In un sistema Linux x86 (quindi a 32bit) le chiamate di sistema vengono fatte storicamente avvalendosi dell&amp;#039;istruzione &amp;#039;&amp;#039;INT 80h&amp;#039;&amp;#039;. Questo interrupt è un interrupt di tipo software e viene &amp;quot;programmato&amp;quot; in fase di inizializzazione del kernel, subito dopo il boot. L&amp;#039;&amp;#039;&amp;#039;INT 80h&amp;#039;&amp;#039; non fa altro che portare il processo che esegue la chiamata dallo spazio utente (il processo appunto) allo spazio kernel.&lt;br /&gt;
Dai processori Pentium2 sono però state introdotte altre due istruzioni per effettuare in modo più ottimizzato questo salto. Queste istruzioni sono [http://en.wikipedia.org/wiki/System_call &amp;#039;&amp;#039;Sysenter&amp;#039;&amp;#039; e &amp;#039;&amp;#039;Sysexit&amp;#039;&amp;#039;] che rispettivamente permettono di &amp;quot;entrare ed uscire&amp;quot; dal kernel.&lt;br /&gt;
&lt;br /&gt;
Per poter sfruttare queste istruzioni occorre che il processore, il kernel e le glibc le supportino! In particolare si &lt;br /&gt;
deva avere che:&lt;br /&gt;
* Il processore sia un Penium2 o superiore&lt;br /&gt;
* Il kernel sia un 2.6.x, ma il supporto fu introdotto dalla versione sperimentale 2.5.53&lt;br /&gt;
* La glibc supporti queste istruzioni e, soprattutto, sia stata compilata adeguatamente per introdurre questa feature&lt;br /&gt;
&lt;br /&gt;
===Benchmark: quando e perchè usare Sysenter===&lt;br /&gt;
L&amp;#039;istruzione &amp;#039;&amp;#039;Sysenter&amp;#039;&amp;#039; permette di ottimizzare accelerando l&amp;#039;ingresso nel kernel e quindi ottimizzare &amp;#039;&amp;#039;&amp;#039;tutte&amp;#039;&amp;#039;&amp;#039; le &lt;br /&gt;
chiamate di siatema. Si è notato infatti che [http://kerneltrap.org/node/531 le chiamate eseguite in INT 80h sono più lente rispetto alla SYSENTER] e un Pentium4 impiega di più di un Pentium3 (e qualche volta di un Pentum2) per eseguire certe operazioni di sistema. In questi casi quindi è bene usare questa chiamata.&lt;br /&gt;
Ciò che segue prende in riferimento una Slackware 13 con kernel 2.6.32.2 su P4 e glibc 2.9.&lt;br /&gt;
&lt;br /&gt;
====Test====&lt;br /&gt;
Per eseguire un test comparativo, basta un qualsiasi sistema Linux 2.6 e non è necessario che le librerie glibc supportino di già la sysenter, come vedremo tra poco. Il sistema Linux di riferimento è, come detto, una Slackware. La slackware ottimizza le librerie per i486 senza abilitare l&amp;#039;istruzione SYSENTER. Quindi per poter testare la velocità occorre scrivere del codice assembly. Il benchmark proposto imita nella sostanza quello dato all&amp;#039;indirizzo  http://kerneltrap.org/node/531, ossia vogliamo eseguire 20 milioni di chiamate &amp;#039;&amp;#039;getpid()&amp;#039;&amp;#039;. Il codice proposto è il seguente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;
//numero di cicli da fare&lt;br /&gt;
#define K 1000000&lt;br /&gt;
&lt;br /&gt;
#ifdef NO_DYNAMIC_VDSO&lt;br /&gt;
#define sys_getpid() __asm__( \&lt;br /&gt;
                                  &amp;quot;movl $20, %eax    \n&amp;quot; \&lt;br /&gt;
                                  &amp;quot;call 0xffffe414   \n&amp;quot; \&lt;br /&gt;
                                  &amp;quot;movl %eax, pid    \n&amp;quot; \&lt;br /&gt;
                                  );&lt;br /&gt;
#else&lt;br /&gt;
#define sys_getpid() __asm__( \&lt;br /&gt;
                                 &amp;quot;movl $20, %eax    \n&amp;quot; \&lt;br /&gt;
                                 &amp;quot;call *%gs:0x10    \n&amp;quot; \&lt;br /&gt;
                                 &amp;quot;movl %eax, pid    \n&amp;quot; \&lt;br /&gt;
                                 );&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
int pid=0;&lt;br /&gt;
unsigned long i;&lt;br /&gt;
&lt;br /&gt;
int main(int c, char **v)&lt;br /&gt;
{&lt;br /&gt;
   if(c&amp;gt;1) // se passo un parametro qualsiasi, uso le chiamate di sistema&lt;br /&gt;
     {  &lt;br /&gt;
	puts(&amp;quot;GetPid()&amp;quot;);&lt;br /&gt;
	asm(&amp;quot;xor %ebx, %ebx&amp;quot;); 	// mi assicuro di azzerare un registro che non viene usato&lt;br /&gt;
	while(i++ &amp;lt; K) { 	// eseguirò 20 chiamate per un totale di K*20&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;); //azzero il valore del pid in memoria&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);	&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	   pid = getpid(); asm(&amp;quot;mov %ebx, %gs:0x48;&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
     } else  // altrimenti senza parametri uso la SYSENTER&lt;br /&gt;
     {&lt;br /&gt;
	puts(&amp;quot;__asm__ &amp;quot;);&lt;br /&gt;
	while(i++ &amp;lt; K)&lt;br /&gt;
	  {&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	     sys_getpid();&lt;br /&gt;
	  }&lt;br /&gt;
     }&lt;br /&gt;
   &lt;br /&gt;
   return pid;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Questo codice NON va compilato staticamente con l&amp;#039;opzione -DNO_DYNAMIC_VDSO se il VDSO è dinamico, altrimenti &amp;#039;&amp;#039;sys_getpid()&amp;#039;&amp;#039; genererà un SEGFAULT. Per compilarlo occorre valutare due condizioni:&lt;br /&gt;
# &amp;#039;&amp;#039;VDSO statico&amp;#039;&amp;#039;: se eseguendo il comando &amp;#039;&amp;#039;cat /proc/sys/vm/vdso_enabled&amp;#039;&amp;#039; il risulatato è 1, il vostro VDSO è dinamico. Lo si può anche vedere eseguento &amp;#039;&amp;#039;ldd /bin/ls&amp;#039;&amp;#039; due volte e vedere che la libreria (virtuale) linux-gate.so cambia il proprio indirizzo. In questo caso la compilazione si effettua semplicemente con &amp;#039;&amp;#039;make misura_getpid&amp;#039;&amp;#039;.&lt;br /&gt;
# &amp;#039;&amp;#039;VDSO dinamico&amp;#039;&amp;#039;: se eseguendo il comando &amp;#039;&amp;#039;cat /proc/sys/vm/vdso_enabled&amp;#039;&amp;#039; il risulatato è 2, il vostro VDSO è statico. Lo si può anche vedere eseguento &amp;#039;&amp;#039;ldd /bin/ls&amp;#039;&amp;#039; due volte e vedere che la libreria (virtuale) linux-gate.so non cambia il proprio indirizzo. In questo caso si può compilare anche con &amp;#039;&amp;#039;gcc -DNO_DINAMIC_VDSO misura_getpid.c -o misura_getpid&amp;#039;&amp;#039;.&lt;br /&gt;
Attenzione: se &amp;#039;&amp;#039;cat /proc/sys/vm/vdso_enabled&amp;#039;&amp;#039; fosse 0, NON potreste usare ne SYSCALL ne SYSENTER. O quantomeno il sistema dovrebbe puntare ad un indirizzo in cui verrebbe eseguito &amp;#039;&amp;#039;INT 80h&amp;#039;&amp;#039;, perdendo di fatto ogni beneficio.&lt;br /&gt;
&lt;br /&gt;
Eseguiamo quindi il codice compilato misurando il tempo. Lanciamo da shell l&amp;#039;eseguibile:&lt;br /&gt;
&amp;lt;pre&amp;gt;time ./misura_getpid c ; time ./misura_getpid&amp;lt;/pre&amp;gt;&lt;br /&gt;
Sul mio sistema, con VDSO forzato statico, il risultato è il seguente:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GetPid()&lt;br /&gt;
&lt;br /&gt;
real    0m9.613s&lt;br /&gt;
user    0m4.400s&lt;br /&gt;
sys     0m5.192s&lt;br /&gt;
__asm__ &lt;br /&gt;
&lt;br /&gt;
real    0m3.381s&lt;br /&gt;
user    0m1.228s&lt;br /&gt;
sys     0m2.132s&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Come si nota i tempi di esecuzione sono ridotti circa a 1/3 usando la SYSENTER!! Quindi non c&amp;#039;è motivo di non usarla.&lt;br /&gt;
&lt;br /&gt;
=====Note sul codice===== &lt;br /&gt;
# &amp;#039;&amp;#039;Cosa significano &amp;quot;call *%gs:0x10&amp;quot; e &amp;quot;call 0xffffe414&amp;quot;?&amp;#039;&amp;#039; queste chiamate dicono al processo di saltare all&amp;#039;indirizzo __kernel_vsyscall. Questo indirizzo eseguirà o la SYSENTER se supportata, o l&amp;#039;INT 80h.&lt;br /&gt;
# &amp;#039;&amp;#039;Ma perchè proprio &amp;quot;call *%gs:0x10&amp;quot; e &amp;quot;call 0xffffe414&amp;quot;?&amp;#039;&amp;#039; questi indirizzi possono variare con la versione del kernel. Per esempio poco tempo fa l&amp;#039;indirizzo &amp;#039;&amp;#039;__kernel_vsyscall&amp;#039;&amp;#039; era a 0xfffe400. Nei link sotto riportati viene spiegato come determinare questi indirizzi.&lt;br /&gt;
# &amp;#039;&amp;#039;Perchè asm(&amp;quot;xor %ebx, %ebx&amp;quot;); prima delle chiamate di sistema?&amp;#039;&amp;#039; perchè devo creare un registro azzerato per poter azzerare l&amp;#039;indirizzio di memoria &amp;quot;%gs:0x48&amp;quot;. Il registro EBX non viene mai toccato e quindi ho scelto quello.&lt;br /&gt;
# &amp;#039;&amp;#039;E&amp;#039; proprio necessario azzerare &amp;quot;%gs:0x48&amp;quot;?&amp;#039;&amp;#039; Sì. Gli esempi riportati in rete NON mostrano il codice dei loro benchmark, ma dicono che usano la chiamata &amp;#039;&amp;#039;getpid()&amp;#039;&amp;#039;. Questa chiamata però è ingannevole e quanto sto per dire è stato verificato per glibc-2.9. Se provassimo a disassemblare &amp;#039;&amp;#039;getpid()&amp;#039;&amp;#039; da un binario compilato staticamente si otterrebbe una cosa come questa:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
0x08051a10 &amp;lt;getpid+0&amp;gt;:  mov    %gs:0x4c,%edx&lt;br /&gt;
0x08051a17 &amp;lt;getpid+7&amp;gt;:  cmp    $0x0,%edx&lt;br /&gt;
0x08051a1a &amp;lt;getpid+10&amp;gt;: mov    %edx,%eax&lt;br /&gt;
0x08051a1c &amp;lt;getpid+12&amp;gt;: jle    0x8051a20 &amp;lt;getpid+16&amp;gt;&lt;br /&gt;
0x08051a1e &amp;lt;getpid+14&amp;gt;: repz ret &lt;br /&gt;
0x08051a20 &amp;lt;getpid+16&amp;gt;: jne    0x8051a2c &amp;lt;getpid+28&amp;gt;&lt;br /&gt;
0x08051a22 &amp;lt;getpid+18&amp;gt;: mov    %gs:0x48,%eax&lt;br /&gt;
0x08051a28 &amp;lt;getpid+24&amp;gt;: test   %eax,%eax&lt;br /&gt;
0x08051a2a &amp;lt;getpid+26&amp;gt;: jne    0x8051a1e &amp;lt;getpid+14&amp;gt;&lt;br /&gt;
0x08051a2c &amp;lt;getpid+28&amp;gt;: mov    $0x14,%eax&lt;br /&gt;
0x08051a31 &amp;lt;getpid+33&amp;gt;: int    $0x80&lt;br /&gt;
0x08051a33 &amp;lt;getpid+35&amp;gt;: test   %edx,%edx&lt;br /&gt;
0x08051a35 &amp;lt;getpid+37&amp;gt;: mov    %eax,%ecx&lt;br /&gt;
0x08051a37 &amp;lt;getpid+39&amp;gt;: jne    0x8051a1e &amp;lt;getpid+14&amp;gt;&lt;br /&gt;
0x08051a39 &amp;lt;getpid+41&amp;gt;: mov    %ecx,%gs:0x48&lt;br /&gt;
0x08051a40 &amp;lt;getpid+48&amp;gt;: ret &lt;br /&gt;
&amp;lt;/pre&amp;gt; In pratica il processo chiede al kernel qual è il suo PID e lo salva subito in &amp;quot;%gs:0x48&amp;quot; (con l&amp;#039;istruzione &amp;quot;mov %ecx,%gs:0x48&amp;quot;). Quindi alla seconda chiamata, il sistema caricherà il PID in EAX con l&amp;#039;istruzione &amp;quot;mov %gs:0x48,%eax&amp;quot; (quindi non effettua nessuna call) e valuta se è diverso da 0 (&amp;quot;test %eax,%eax&amp;quot;). Se non lo è allora il valore è ritenuto il PID del processo e viene restituito senza effettuare l&amp;#039;INT 80h rendendo tutto estremamente veloce, ma falsando i risultati del test.&lt;br /&gt;
&lt;br /&gt;
====&amp;#039;&amp;#039;&amp;#039;SlackWare&amp;#039;&amp;#039;&amp;#039; - Abilitazione delle SYSENTER/SYSEXIT====&lt;br /&gt;
Come detto Slackware 13 e inferiori NON usano le istruzioni SYSENTER. Ma cosa occorre fre per abilitarle? Semplice: l&amp;#039;uso di SYSENTER/SYSEXIT dipende in ultima analisi principalmente dalle [[http://www.gnu.org/software/libc/ librerie di sistema &amp;#039;&amp;#039;&amp;#039;glibc&amp;#039;&amp;#039;&amp;#039;]! Basta semplicemente ricompilarle, ma con le debite migliorie. Di seguito è riportato lo slackbuild utilizzato per fare ciò. Questo è lo slackbuild che si trova nei repository SlackWare 13 opportunamente modificato per i686:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
# Copyright 2006, 2008, 2009  Patrick J. Volkerding, Sebeka, MN, USA&lt;br /&gt;
# All rights reserved.&lt;br /&gt;
## build glibc-$VERSION for Slackware&lt;br /&gt;
&lt;br /&gt;
VERSION=${VERSION:-2.9}&lt;br /&gt;
CHECKOUT=${CHECKOUT:--20090316}&lt;br /&gt;
BUILD=${BUILD:-calzo}&lt;br /&gt;
# $ARCH may be preset, otherwise i486 compatibility with i686 binary&lt;br /&gt;
# structuring is the Slackware default, since this is what gcc-3.2+&lt;br /&gt;
# requires for binary compatibility with previous releases.&lt;br /&gt;
ARCH=i686&lt;br /&gt;
&lt;br /&gt;
CVSVER=${VERSION}${CHECKOUT}&lt;br /&gt;
&lt;br /&gt;
# NOTE!!!  glibc needs to be built against the sanitized kernel headers,&lt;br /&gt;
# which will be installed under /usr/include by the kernel-headers package.&lt;br /&gt;
# Be sure the correct version of the headers package is installed BEFORE&lt;br /&gt;
# building glibc!&lt;br /&gt;
&lt;br /&gt;
CWD=$(pwd)&lt;br /&gt;
# Temporary build location.  This should not be a directory&lt;br /&gt;
# path a non-root user could create later...&lt;br /&gt;
TMP=${TMP:-/glibc-tmp-$(mcookie)}&lt;br /&gt;
mkdir -p $TMP&lt;br /&gt;
&lt;br /&gt;
# Sanity check on the version number in the install scripts:&lt;br /&gt;
if ! grep -vq libutil-$VERSION}.so $CWD/doinst.sh-glibc ; then&lt;br /&gt;
  echo &amp;quot;FATAL:  doinst.sh scripts have wrong version numbers.&amp;quot;&lt;br /&gt;
  exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
case $ARCH in&lt;br /&gt;
  i686)&lt;br /&gt;
    echo&lt;br /&gt;
    echo ====================== i686 ======================&lt;br /&gt;
    echo&lt;br /&gt;
    sleep 2;&lt;br /&gt;
    TARGET=pentium4&lt;br /&gt;
    ;;&lt;br /&gt;
  x86_64)&lt;br /&gt;
    TARGET=${TARGET:-x86_64}&lt;br /&gt;
    ;;&lt;br /&gt;
  i486)&lt;br /&gt;
    # This should be i486 for all 32-bit x86 arch:&lt;br /&gt;
    TARGET=${TARGET:-i486}&lt;br /&gt;
    ;;&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
# This function fixes a doinst.sh file for x86_64.&lt;br /&gt;
# With thanks to Fred Emmott.&lt;br /&gt;
fix_doinst() {&lt;br /&gt;
  if [ &amp;quot;x$LIBDIRSUFFIX&amp;quot; = &amp;quot;x&amp;quot; ]; then&lt;br /&gt;
    return;&lt;br /&gt;
  fi;&lt;br /&gt;
  # Fix &amp;quot;( cd usr/lib ;&amp;quot; occurrences&lt;br /&gt;
  sed -i &amp;quot;s#lib ;#lib${LIBDIRSUFFIX} ;#&amp;quot; install/doinst.sh&lt;br /&gt;
  # Fix &amp;quot;lib/&amp;quot; occurrences&lt;br /&gt;
  sed -i &amp;quot;s#lib/#lib${LIBDIRSUFFIX}/#g&amp;quot; install/doinst.sh&lt;br /&gt;
  # Fix &amp;quot;( cd lib&amp;quot; occurrences&lt;br /&gt;
  sed -i &amp;quot;s#( cd lib\$#( cd lib${LIBDIRSUFFIX}#&amp;quot; install/doinst.sh&lt;br /&gt;
&lt;br /&gt;
  if [ &amp;quot;$ARCH&amp;quot; = &amp;quot;x86_64&amp;quot; ]; then&lt;br /&gt;
    sed -i &amp;#039;s#ld-linux.so.2#ld-linux-x86-64.so.2#&amp;#039; install/doinst.sh&lt;br /&gt;
  fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# This is a patch function to put all glibc patches in the build script&lt;br /&gt;
# up near the top.&lt;br /&gt;
apply_patches() {&lt;br /&gt;
  # Use old-style locale directories rather than a single (and strangely&lt;br /&gt;
  # formatted) /usr/lib/locale/locale-archive file:&lt;br /&gt;
  zcat $CWD/glibc.locale.no-archive.diff.gz | patch -p1 --verbose || exit 1&lt;br /&gt;
  # The is_IS locale is causing a strange error about the &amp;quot;echn&amp;quot; command&lt;br /&gt;
  # not existing.  This patch reverts is_IS to the version shipped in&lt;br /&gt;
  # glibc-2.5:&lt;br /&gt;
  zcat $CWD/is_IS.diff.gz | patch -p1 --verbose || exit 1&lt;br /&gt;
  # Fix NIS netgroups:&lt;br /&gt;
  zcat $CWD/glibc.nis-netgroups.diff.gz | patch -p1 --verbose || exit 1&lt;br /&gt;
  # Support ru_RU.CP1251 locale:&lt;br /&gt;
  zcat $CWD/glibc.ru_RU.CP1251.diff.gz | patch -p1 --verbose || exit 1&lt;br /&gt;
  # Fix missing MAX macro in getcwd.c:&lt;br /&gt;
  zcat $CWD/glibc.getcwd.max.macro.diff.gz | patch -p1 --verbose || exit 1&lt;br /&gt;
  # Fix resolver problem with glibc-2.9:&lt;br /&gt;
  zcat $CWD/glibc-2.10-dns-no-gethostbyname4.diff.gz | patch -p0 --verbose || exit 1&lt;br /&gt;
  # This reverts a patch that was made to glibc to fix &amp;quot;namespace leakage&amp;quot;,&lt;br /&gt;
  # which seems to cause some build failures (e.g. with conntrack):&lt;br /&gt;
  zcat $CWD/glibc.revert.to.fix.build.breakages.diff.gz | patch -p1 --verbose || exit 1&lt;br /&gt;
  # Update the timezone information.&lt;br /&gt;
  ( cd timezone&lt;br /&gt;
    tar xzf $CWD/tzdata2009d.tar.gz&lt;br /&gt;
    chown root:root *&lt;br /&gt;
    mv yearistype.sh yearistype&lt;br /&gt;
    chmod 644 *&lt;br /&gt;
    chmod 755 yearistype&lt;br /&gt;
    mkdir tzcode&lt;br /&gt;
    cd tzcode&lt;br /&gt;
    tar xzf $CWD/tzcode2009d.tar.gz&lt;br /&gt;
    chown -R root:root .&lt;br /&gt;
    chmod 644 *&lt;br /&gt;
    cp -a *.c *.h ..&lt;br /&gt;
  )&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
# I&amp;#039;ll break this out as an option for fun  :-)&lt;br /&gt;
case $ARCH  in&lt;br /&gt;
  i386)&lt;br /&gt;
    OPTIMIZ=&amp;quot;-O3 -march=i386 -mcpu=i686&amp;quot;&lt;br /&gt;
    LIBDIRSUFFIX=&amp;quot;&amp;quot;&lt;br /&gt;
    ;;&lt;br /&gt;
  i486)&lt;br /&gt;
    OPTIMIZ=&amp;quot;-O3 -march=i486 -mtune=i686&amp;quot;&lt;br /&gt;
    LIBDIRSUFFIX=&amp;quot;&amp;quot;&lt;br /&gt;
    ;;&lt;br /&gt;
  i586)&lt;br /&gt;
    OPTIMIZ=&amp;quot;-O3 -march=i586&amp;quot;&lt;br /&gt;
    LIBDIRSUFFIX=&amp;quot;&amp;quot;&lt;br /&gt;
    ;;&lt;br /&gt;
  i686)&lt;br /&gt;
    echo ====================== ADD Flags ======================&lt;br /&gt;
    sleep 2;&lt;br /&gt;
    OPTIMIZ=&amp;quot;-O3 -march=i686 -mtune=i686&amp;quot;&lt;br /&gt;
    LIBDIRSUFFIX=&amp;quot;&amp;quot;&lt;br /&gt;
    ;;&lt;br /&gt;
  athlon)&lt;br /&gt;
    OPTIMIZ=&amp;quot;-O3 -march=athlon&amp;quot;&lt;br /&gt;
    LIBDIRSUFFIX=&amp;quot;&amp;quot;&lt;br /&gt;
    ;;&lt;br /&gt;
  s390)&lt;br /&gt;
    OPTIMIZ=&amp;quot;-O3&amp;quot;&lt;br /&gt;
    LIBDIRSUFFIX=&amp;quot;&amp;quot;&lt;br /&gt;
    ;;&lt;br /&gt;
  x86_64)&lt;br /&gt;
    OPTIMIZ=&amp;quot;-O3 -fPIC&amp;quot;&lt;br /&gt;
    LIBDIRSUFFIX=&amp;quot;64&amp;quot;&lt;br /&gt;
    ;;&lt;br /&gt;
  *)&lt;br /&gt;
    OPTIMIZ=&amp;quot;-O3&amp;quot;&lt;br /&gt;
    LIBDIRSUFFIX=&amp;quot;&amp;quot;&lt;br /&gt;
    ;;&lt;br /&gt;
esac&lt;br /&gt;
&lt;br /&gt;
# This is going to be the initial $DESTDIR:&lt;br /&gt;
export PKG=$TMP/package-glibc-incoming-tree&lt;br /&gt;
PGLIBC=$TMP/package-glibc&lt;br /&gt;
PSOLIBS=$TMP/package-glibc-solibs&lt;br /&gt;
PZONE=$TMP/package-glibc-zoneinfo&lt;br /&gt;
PI18N=$TMP/package-glibc-i18n&lt;br /&gt;
PPROFILE=$TMP/package-glibc-profile&lt;br /&gt;
PDEBUG=$TMP/package-glibc-debug&lt;br /&gt;
&lt;br /&gt;
# Empty these locations first:&lt;br /&gt;
for dir in $PKG $PGLIBC $PSOLIBS $PZONE $PI18N $PPROFILE $PDEBUG ; do&lt;br /&gt;
  if [ -d $dir ]; then&lt;br /&gt;
    rm -rf $dir&lt;br /&gt;
  fi&lt;br /&gt;
  mkdir -p $dir&lt;br /&gt;
done&lt;br /&gt;
if [ -d $TMP/glibc-$VERSION ]; then&lt;br /&gt;
  rm -rf $TMP/glibc-$VERSION&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Create an incoming directory structure for glibc to be built into:&lt;br /&gt;
mkdir -p $PKG/lib${LIBDIRSUFFIX}&lt;br /&gt;
mkdir -p $PKG/sbin&lt;br /&gt;
mkdir -p $PKG/usr/bin&lt;br /&gt;
mkdir -p $PKG/usr/lib${LIBDIRSUFFIX}&lt;br /&gt;
mkdir -p $PKG/usr/sbin&lt;br /&gt;
mkdir -p $PKG/usr/include&lt;br /&gt;
mkdir -p $PKG/usr/doc&lt;br /&gt;
mkdir -p $PKG/usr/man&lt;br /&gt;
mkdir -p $PKG/usr/share&lt;br /&gt;
mkdir -p $PKG/var/db/nscd&lt;br /&gt;
mkdir -p $PKG/var/run/nscd&lt;br /&gt;
&lt;br /&gt;
# Begin extract/compile:&lt;br /&gt;
cd $TMP&lt;br /&gt;
rm -rf glibc-$CVSVER&lt;br /&gt;
tar xjf $CWD/glibc-$CVSVER.tar.bz2&lt;br /&gt;
cd glibc-$CVSVER&lt;br /&gt;
&lt;br /&gt;
chown -R root:root .&lt;br /&gt;
find . -perm 666 -exec chmod 644 {} \;&lt;br /&gt;
find . -perm 664 -exec chmod 644 {} \;&lt;br /&gt;
find . -perm 600 -exec chmod 644 {} \;&lt;br /&gt;
find . -perm 444 -exec chmod 644 {} \;&lt;br /&gt;
find . -perm 400 -exec chmod 644 {} \;&lt;br /&gt;
find . -perm 440 -exec chmod 644 {} \;&lt;br /&gt;
find . -perm 777 -exec chmod 755 {} \;&lt;br /&gt;
find . -perm 775 -exec chmod 755 {} \;&lt;br /&gt;
find . -perm 511 -exec chmod 755 {} \;&lt;br /&gt;
find . -perm 711 -exec chmod 755 {} \;&lt;br /&gt;
find . -perm 555 -exec chmod 755 {} \;&lt;br /&gt;
&lt;br /&gt;
# Clean up leftover CVS directories:&lt;br /&gt;
find . -type d -name CVS -exec rm -r {} \; 2&amp;gt; /dev/null&lt;br /&gt;
&lt;br /&gt;
# Apply patches; exit if any fail.&lt;br /&gt;
apply_patches&lt;br /&gt;
if [ ! $? = 0 ]; then&lt;br /&gt;
  exit 1&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# Make build directory:&lt;br /&gt;
mkdir build-glibc-$VERSION&lt;br /&gt;
cd build-glibc-$VERSION&lt;br /&gt;
&lt;br /&gt;
echo &amp;quot;BUILDING DAS NPTL GLIBC&amp;quot;&lt;br /&gt;
CFLAGS=&amp;quot;$OPTIMIZ&amp;quot; \&lt;br /&gt;
../configure \&lt;br /&gt;
  --prefix=/usr \&lt;br /&gt;
  --libdir=/usr/lib${LIBDIRSUFFIX} \&lt;br /&gt;
  --enable-kernel=2.6.18 \&lt;br /&gt;
  --with-headers=/usr/include \&lt;br /&gt;
  --enable-add-ons=nptl,libidn \&lt;br /&gt;
  --enable-profile \&lt;br /&gt;
  --infodir=/usr/info \&lt;br /&gt;
  --mandir=/usr/man \&lt;br /&gt;
  --with-tls \&lt;br /&gt;
  --with-__thread \&lt;br /&gt;
  --without-cvs \&lt;br /&gt;
  --without-gd \&lt;br /&gt;
  --enable-bind-now \&lt;br /&gt;
  --enable-shared \&lt;br /&gt;
  $TARGET-slackware-linux&lt;br /&gt;
&lt;br /&gt;
make -j4 &amp;gt; /dev/null || exit 1&lt;br /&gt;
make install install_root=$PKG || exit 1&lt;br /&gt;
make localedata/install-locales install_root=$PKG || exit 1&lt;br /&gt;
&lt;br /&gt;
# The prevailing standard seems to be putting unstripped libraries in&lt;br /&gt;
# /usr/lib/debug/ and stripping the debugging symbols from all the other&lt;br /&gt;
# libraries.&lt;br /&gt;
mkdir -p $PKG/usr/lib${LIBDIRSUFFIX}/debug&lt;br /&gt;
cp -a $PKG/lib${LIBDIRSUFFIX}/l*.so* $PKG/usr/lib${LIBDIRSUFFIX}/debug&lt;br /&gt;
cp -a $PKG/usr/lib${LIBDIRSUFFIX}/*.a $PKG/usr/lib${LIBDIRSUFFIX}/debug&lt;br /&gt;
# Don&amp;#039;t need debug+profile:&lt;br /&gt;
( cd $PKG/usr/lib${LIBDIRSUFFIX}/debug ; rm -f *_p.* )&lt;br /&gt;
# NOTE:  Is there really a reason for the glibc-debug package?&lt;br /&gt;
# If you&amp;#039;re debugging glibc, you can also compile it, right?&lt;br /&gt;
&lt;br /&gt;
## COMMENTED OUT:  There&amp;#039;s no reason for profile libs to include -g information.&lt;br /&gt;
## Put back unstripped profiling libraries:&lt;br /&gt;
#mv $PKG/usr/lib${LIBDIRSUFFIX}/debug/*_p.a $PKG/usr/lib${LIBDIRSUFFIX}&lt;br /&gt;
# It might be best to put the unstripped and profiling libraries in glibc-debug and glibc-profile.&lt;br /&gt;
&lt;br /&gt;
# I don&amp;#039;t think &amp;quot;strip -g&amp;quot; causes the pthread problems.  It&amp;#039;s --strip-unneeded that does.&lt;br /&gt;
strip -g $PKG/lib${LIBDIRSUFFIX}/l*.so*&lt;br /&gt;
strip -g $PKG/usr/lib${LIBDIRSUFFIX}/l*.so*&lt;br /&gt;
strip -g $PKG/usr/lib${LIBDIRSUFFIX}/lib*.a&lt;br /&gt;
&lt;br /&gt;
# Back to the sources dir to add some files/docs:&lt;br /&gt;
cd $TMP/glibc-$CVSVER&lt;br /&gt;
&lt;br /&gt;
# We&amp;#039;ll automatically install the config file for the Name Server Cache Daemon.&lt;br /&gt;
# Perhaps this should also have some commented-out startup code in rc.inet2...&lt;br /&gt;
mkdir -p $PKG/etc&lt;br /&gt;
cat nscd/nscd.conf &amp;gt; $PKG/etc/nscd.conf.new&lt;br /&gt;
&lt;br /&gt;
# Install some scripts to help select a timezone:&lt;br /&gt;
mkdir -p $PKG/var/log/setup&lt;br /&gt;
cp -a $CWD/timezone-scripts/setup.timeconfig $PKG/var/log/setup&lt;br /&gt;
chown root:root $PKG/var/log/setup/setup.timeconfig&lt;br /&gt;
chmod 755 $PKG/var/log/setup/setup.timeconfig&lt;br /&gt;
mkdir -p $PKG/usr/sbin&lt;br /&gt;
cp -a $CWD/timezone-scripts/timeconfig $PKG/usr/sbin&lt;br /&gt;
chown root:root $PKG/usr/sbin/timeconfig&lt;br /&gt;
chmod 755 $PKG/usr/sbin/timeconfig&lt;br /&gt;
&lt;br /&gt;
## Install docs:&lt;br /&gt;
( mkdir -p $PKG/usr/doc/glibc-$VERSION&lt;br /&gt;
  cp -a \&lt;br /&gt;
    BUGS CONFORMANCE COPYING COPYING.LIB FAQ INSTALL LICENSES NAMESPACE \&lt;br /&gt;
    NEWS NOTES PROJECTS README README.libm \&lt;br /&gt;
    $PKG/usr/doc/glibc-$VERSION&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
# Don&amp;#039;t forget to add the /usr/share/zoneinfo/localtime -&amp;gt; /etc/localtime symlink! :)&lt;br /&gt;
if [ ! -r $PKG/usr/share/zoneinfo/localtime ]; then&lt;br /&gt;
  ( cd $PKG/usr/share/zoneinfo ; ln -sf /etc/localtime . )&lt;br /&gt;
fi&lt;br /&gt;
&lt;br /&gt;
# OK, there are some very old Linux standards that say that any binaries in a /bin or&lt;br /&gt;
# /sbin directory (and the directories themselves) should be group bin rather than&lt;br /&gt;
# group root, unless a specific group is really needed for some reason.&lt;br /&gt;
#&lt;br /&gt;
# I can&amp;#039;t find any mention of this in more recent standards docs, and always thought&lt;br /&gt;
# that it was pretty cosmetic anyway (hey, if there&amp;#039;s a reason -- fill me in!), so&lt;br /&gt;
# it&amp;#039;s possible that this ownership change won&amp;#039;t be followed in the near future&lt;br /&gt;
# (it&amp;#039;s a PITA, and causes many bug reports when the perms change is occasionally&lt;br /&gt;
# forgotten).&lt;br /&gt;
#&lt;br /&gt;
# But, it&amp;#039;s hard to get me to break old habits, so we&amp;#039;ll continue the tradition here:&lt;br /&gt;
#&lt;br /&gt;
# No, no we won&amp;#039;t.  You know how we love to break traditions.&lt;br /&gt;
&lt;br /&gt;
# Strip most binaries:&lt;br /&gt;
( cd $PKG&lt;br /&gt;
  find . | xargs file | grep &amp;quot;executable&amp;quot; | grep ELF | cut -f 1 -d : | xargs strip --strip-debug 2&amp;gt; /dev/null&lt;br /&gt;
  find . | xargs file | grep &amp;quot;shared object&amp;quot; | grep ELF | cut -f 1 -d : | xargs strip -g 2&amp;gt; /dev/null&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
# Fix info dir:&lt;br /&gt;
rm $PKG/usr/info/dir&lt;br /&gt;
gzip -9 $PKG/usr/info/*&lt;br /&gt;
&lt;br /&gt;
# This is junk&lt;br /&gt;
rm $PKG/etc/ld.so.cache&lt;br /&gt;
( cd $PKG&lt;br /&gt;
  find . -name &amp;quot;*.orig&amp;quot; -exec rm {} \;&lt;br /&gt;
)&lt;br /&gt;
&lt;br /&gt;
##################################&lt;br /&gt;
# OK, time to make some packages #&lt;br /&gt;
##################################&lt;br /&gt;
&lt;br /&gt;
# glibc-zoneinfo.  We will start with an easy one to avoid breaking a sweat.  ;-)&lt;br /&gt;
cd $PZONE&lt;br /&gt;
# Install some scripts to help select a timezone:&lt;br /&gt;
mkdir -p $PZONE/var/log/setup&lt;br /&gt;
cp -a $CWD/timezone-scripts/setup.timeconfig $PZONE/var/log/setup&lt;br /&gt;
chown root:root $PZONE/var/log/setup/setup.timeconfig&lt;br /&gt;
chmod 755 $PZONE/var/log/setup/setup.timeconfig&lt;br /&gt;
mkdir -p $PZONE/usr/sbin&lt;br /&gt;
cp -a $CWD/timezone-scripts/timeconfig $PZONE/usr/sbin&lt;br /&gt;
chown root:root $PZONE/usr/sbin/timeconfig&lt;br /&gt;
chmod 755 $PZONE/usr/sbin/timeconfig&lt;br /&gt;
mkdir $PZONE/install&lt;br /&gt;
cat $CWD/doinst.sh-glibc-zoneinfo &amp;gt; $PZONE/install/doinst.sh&lt;br /&gt;
cat $CWD/slack-desc.glibc-zoneinfo &amp;gt; $PZONE/install/slack-desc&lt;br /&gt;
mkdir -p $PZONE/usr/share&lt;br /&gt;
cd $PZONE/usr/share&lt;br /&gt;
cp -a --verbose $PKG/usr/share/zoneinfo .&lt;br /&gt;
cd $PZONE&lt;br /&gt;
mkdir -p $PZONE/etc&lt;br /&gt;
# This is already hard-coded into doinst.sh (like it&amp;#039;ll be there anyway ;-):&lt;br /&gt;
rm -f etc/localtime&lt;br /&gt;
# Wrap it up:&lt;br /&gt;
makepkg -l y -c n $TMP/glibc-zoneinfo-$VERSION-noarch-$BUILD.txz&lt;br /&gt;
&lt;br /&gt;
# glibc-profile:&lt;br /&gt;
cd $PPROFILE&lt;br /&gt;
mkdir -p usr/lib${LIBDIRSUFFIX}&lt;br /&gt;
# Might as well just grab these with &amp;#039;mv&amp;#039; to simplify things later:&lt;br /&gt;
mv $PKG/usr/lib${LIBDIRSUFFIX}/lib*_p.a usr/lib${LIBDIRSUFFIX}&lt;br /&gt;
# Profile libs should be stripped.  Use the debug libs to debug...&lt;br /&gt;
( cd usr/lib${LIBDIRSUFFIX} ; strip -g *.a )&lt;br /&gt;
mkdir install&lt;br /&gt;
cp -a $CWD/slack-desc.glibc-profile install/slack-desc&lt;br /&gt;
makepkg -l y -c n $TMP/glibc-profile-$VERSION-$ARCH-$BUILD.txz&lt;br /&gt;
&lt;br /&gt;
# THIS IS NO LONGER PACKAGED (or is it?  might be better to let it be made, and then ship it or not...)&lt;br /&gt;
# glibc-debug:&lt;br /&gt;
cd $PDEBUG&lt;br /&gt;
mkdir -p usr/lib${LIBDIRSUFFIX}&lt;br /&gt;
# Might as well just grab these with &amp;#039;mv&amp;#039; to simplify things later:&lt;br /&gt;
mv $PKG/usr/lib${LIBDIRSUFFIX}/debug usr/lib${LIBDIRSUFFIX}&lt;br /&gt;
mkdir install&lt;br /&gt;
cp -a $CWD/slack-desc.glibc-debug install/slack-desc&lt;br /&gt;
makepkg -l y -c n $TMP/glibc-debug-$VERSION-$ARCH-$BUILD.txz&lt;br /&gt;
## INSTEAD, NUKE THESE LIBS&lt;br /&gt;
#rm -rf $PKG/usr/lib${LIBDIRSUFFIX}/debug&lt;br /&gt;
&lt;br /&gt;
# glibc-i18n:&lt;br /&gt;
cd $PI18N&lt;br /&gt;
mkdir -p usr/lib${LIBDIRSUFFIX}&lt;br /&gt;
rm -rf usr/lib${LIBDIRSUFFIX}/locale&lt;br /&gt;
cp -a $PKG/usr/lib${LIBDIRSUFFIX}/locale usr/lib${LIBDIRSUFFIX}&lt;br /&gt;
mkdir -p usr/share&lt;br /&gt;
cp -a $PKG/usr/share/i18n usr/share&lt;br /&gt;
cp -a $PKG/usr/share/locale usr/share&lt;br /&gt;
mkdir install&lt;br /&gt;
cp -a $CWD/slack-desc.glibc-i18n install/slack-desc&lt;br /&gt;
makepkg -l y -c n $TMP/glibc-i18n-$VERSION-$ARCH-$BUILD.txz&lt;br /&gt;
&lt;br /&gt;
# glibc-solibs:&lt;br /&gt;
cd $PSOLIBS&lt;br /&gt;
mkdir -p etc/profile.d&lt;br /&gt;
cp -a $CWD/profile.d/* etc/profile.d&lt;br /&gt;
chown -R root:root etc&lt;br /&gt;
chmod 755 etc/profile.d/*&lt;br /&gt;
mkdir -p lib${LIBDIRSUFFIX}&lt;br /&gt;
cp -a $PKG/lib${LIBDIRSUFFIX}/* lib${LIBDIRSUFFIX}&lt;br /&gt;
( cd lib${LIBDIRSUFFIX}&lt;br /&gt;
  mkdir incoming&lt;br /&gt;
  mv *so* incoming&lt;br /&gt;
  mv incoming/libSegFault.so .&lt;br /&gt;
)&lt;br /&gt;
mkdir -p usr&lt;br /&gt;
cp -a $PKG/usr/bin usr&lt;br /&gt;
mv usr/bin/ldd .&lt;br /&gt;
rm usr/bin/*&lt;br /&gt;
mv ldd usr/bin&lt;br /&gt;
mkdir -p usr/lib${LIBDIRSUFFIX}&lt;br /&gt;
# The gconv directory has a lot of stuff, but including it here will save some problems.&lt;br /&gt;
# Seems standard elsewhere.&lt;br /&gt;
cp -a $PKG/usr/lib${LIBDIRSUFFIX}/gconv usr/lib${LIBDIRSUFFIX}&lt;br /&gt;
# Another manpage abandoned by GNU...&lt;br /&gt;
#mkdir -p usr/man/man1&lt;br /&gt;
#cp -a $PKG/usr/man/man1/ldd.1.gz usr/man/man1&lt;br /&gt;
mkdir -p usr/libexec&lt;br /&gt;
cp -a $PKG/usr/libexec/pt_chown usr/libexec&lt;br /&gt;
# Same usr.bin deal:&lt;br /&gt;
cp -a $PKG/sbin .&lt;br /&gt;
mv sbin/ldconfig .&lt;br /&gt;
rm sbin/*&lt;br /&gt;
mv ldconfig sbin&lt;br /&gt;
mkdir install&lt;br /&gt;
cp -a $CWD/slack-desc.glibc-solibs install/slack-desc&lt;br /&gt;
cp -a $CWD/doinst.sh-glibc-solibs install/doinst.sh&lt;br /&gt;
fix_doinst&lt;br /&gt;
# Ditch links:&lt;br /&gt;
find . -type l -exec rm {} \;&lt;br /&gt;
# Build the package:&lt;br /&gt;
makepkg -l y -c n $TMP/glibc-solibs-$VERSION-$ARCH-$BUILD.txz&lt;br /&gt;
&lt;br /&gt;
# And finally, the complete &amp;quot;all-in-one&amp;quot; glibc package is created&lt;br /&gt;
# from whatever was leftover:&lt;br /&gt;
cd $PGLIBC&lt;br /&gt;
mv $PKG/* .&lt;br /&gt;
mkdir -p etc/profile.d&lt;br /&gt;
cp -a $CWD/profile.d/* etc/profile.d&lt;br /&gt;
chown -R root:root etc&lt;br /&gt;
chmod 755 etc/profile.d/*&lt;br /&gt;
# Ditch links (these are in doinst.sh-glibc):&lt;br /&gt;
find . -type l -exec rm {} \;&lt;br /&gt;
mkdir install&lt;br /&gt;
cp -a $CWD/slack-desc.glibc install/slack-desc&lt;br /&gt;
cp -a $CWD/doinst.sh-glibc install/doinst.sh&lt;br /&gt;
fix_doinst&lt;br /&gt;
( cd lib${LIBDIRSUFFIX}&lt;br /&gt;
  mkdir incoming&lt;br /&gt;
  mv *so* incoming&lt;br /&gt;
  mv incoming/libSegFault.so .&lt;br /&gt;
)&lt;br /&gt;
# Build the package:&lt;br /&gt;
makepkg -l y -c n $TMP/glibc-$VERSION-$ARCH-$BUILD.txz&lt;br /&gt;
&lt;br /&gt;
# Done!&lt;br /&gt;
echo&lt;br /&gt;
echo &amp;quot;glibc packages built in $TMP!&amp;quot;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Le cose più importanti da aggiungere sono &amp;#039;&amp;#039;&amp;#039;--enable-bind-now&amp;#039;&amp;#039;&amp;#039; e &amp;#039;&amp;#039;&amp;#039;--enable-shared&amp;#039;&amp;#039;&amp;#039;. Infati mettere solo i686 non serve ad abilitare le SYSENTER/SYSEXIT.&lt;br /&gt;
&lt;br /&gt;
====Domande====&lt;br /&gt;
# &amp;#039;&amp;#039;Ma se in SlackWare non è abilitata la Sysenter un motivo ci sara?&amp;#039;&amp;#039; A mio dire NO. Si potrebbe ipotizzare che per mantenere la compatibilità con sistemi antecedenti al Pentium2 si sia optato per mantenere l&amp;#039;INT 80h nelle librerie [http://www.gnu.org/software/libc/ glibc]. Ma ciò è insensato perchè la compatibilità è garantita dal [http://www.kernel.org kernel]. Supponiamo infatti di abilitare le sysenter in SlackWare ricompilando e installando i pacchetti .txz. Se voglio installare poi il sistema su un Pentium1 posso farlo semplicemente caricando il kernel con il parametro &amp;#039;&amp;#039;&amp;#039;nosep&amp;#039;&amp;#039;&amp;#039;. Così facendo, l&amp;#039;indirizzo &amp;#039;&amp;#039;__kernel_vsyscall&amp;#039;&amp;#039; viene spostato in modo da eseguire l&amp;#039;istruzione INT 80h. Per capire questo basta estrarre il VDSO da un vostro processo e disassemblarlo totalmente (con &amp;#039;&amp;#039;objdump -D file.dso&amp;#039;&amp;#039;), come spiegato in molti articoli in internet.&lt;br /&gt;
# &amp;#039;&amp;#039;Cambia qualche cosa se ottimizzo per Pentium4, piuttosto che per i686?&amp;#039;&amp;#039; Dai test effettuati da noi non cambia assolutamente nulla. Questo soprattuttoperchè non vengono ustate librerie matematiche nelle glibc e nel kernel e neppure le istruzioni multimediali come MMX, SSE, SSE2, ecc. I nostri test però non tengono conto di opzioni come --enable-fp (nel ./configure) che, unito agli adeguati parametri del compilatore (come &amp;#039;&amp;#039;-mmmx&amp;#039;&amp;#039;, &amp;#039;&amp;#039;-msse&amp;#039;&amp;#039;, ecc) potrebbero forse dare dei benefici sulle librerie matemetiche, le quali però non sono state testate. &lt;br /&gt;
# &amp;#039;&amp;#039;Insisto: voglio ottimizzare per Pentium4!&amp;#039;&amp;#039;: basta sostituire &amp;#039;&amp;#039;-march=i686&amp;#039;&amp;#039; con &amp;#039;&amp;#039;-march=pentium4&amp;#039;&amp;#039;, ma ripeto: non cambia nulla in questa versione delle glibc.&lt;br /&gt;
# &amp;#039;&amp;#039;Esistono distribizioni che usano già questa ottimizzazione?&amp;#039;&amp;#039; Sì, per esempio [http://www.archlinux.org/ ARCH Linux], che è anche abbastanza simile a SlackWare, ma in teoria tutte le distribuzioni ottimizzate per i686 dovrebbero implementare queste istruzioni.&lt;br /&gt;
# &amp;#039;&amp;#039;Slackware 13 a 64 bit cosa fa?&amp;#039;&amp;#039; Fa le cose come si deve e implementa l&amp;#039;istruzine &amp;#039;&amp;#039;SYSCALL&amp;#039;&amp;#039;. Lo si verifica semplicemente disassemblando un qualsiasi programma compilato staticamente. Questa istruzione, in linea teorica, permette di ridurre molte istruzioni e quindi di ottimizzare meglio il codice.&lt;br /&gt;
&lt;br /&gt;
====CONTROINDICAZIONI====&lt;br /&gt;
L&amp;#039;unico problema rilevato fino ad ora nell&amp;#039;aggiornare le glibc è che il kernel di default della slackware (2.6.29.6 nel caso di Slack13) dovrebbe essere ricompilato se si volesse ricompilare il diver proprietario di NVIDIA. Il problema non sussiste se siete abituati a ricompilarvi il kernel e ne avete uno più aggiornato.&lt;br /&gt;
&lt;br /&gt;
====E per sistemi a 64bit?====&lt;br /&gt;
Per sistemi x86_64, &amp;#039;&amp;#039;&amp;#039;AMD&amp;#039;&amp;#039;&amp;#039; (e non Intell) ha introdotto le istruzioni SYSCALL e SYSRET adottate subito dopo anche da Intell per l&amp;#039;estensione a 64 bit dei suoi processori (NON mi riferisco all&amp;#039;architettura IA64). Queste istruzioni sono gestite in modo più performante in quanto evitano la call all&amp;#039;indirizzo &amp;#039;&amp;#039;__kernel_vsyscall&amp;#039;&amp;#039;, ma vengono chiamate subito nel processo al posto della INT 80h.&lt;br /&gt;
Sfortunatamente non sono stati ancora fatti (da noi) test di performance su questa istruzione. &lt;br /&gt;
&lt;br /&gt;
===Link Utili e documentazione===&lt;br /&gt;
* Descrizione ed esempio della sysenter/sysezit: http://manugarg.appspot.com/systemcallinlinux2_6.html&lt;br /&gt;
* The Linux kernel - Andries Brouwer: http://www.win.tue.nl/~aeb/linux/lk/lk-4.html&lt;br /&gt;
* What is linux-gate.so.1? - Johan Petersson: http://www.trilithium.com/johan/2005/08/linux-gate/&lt;br /&gt;
* Understanding The Kernel Linux 3° Edizione&lt;br /&gt;
&lt;br /&gt;
====Info&amp;amp;Credits====&lt;br /&gt;
Tutti i test di compilazione e performance sono stati effettuati alla sede del LUGMan sull&amp;#039;hardware messo a disposizione dall&amp;#039;associazione e dai soci in generale.&lt;br /&gt;
Per qualsiasi informazione, chiarimento o curiosità [[contatti|contattateci!]]&lt;/div&gt;</summary>
		<author><name>Fausto</name></author>
	</entry>
</feed>