÷ƒ’À;è TeX output 2003.11.26:1328‹ÿÿÿÿ Û_2 ý ~? ÕÁ ýZݺóþÖëI½q½qecss2074»The–fÑLinux“GCC“HO‘ÿwmWTOŽ¤ ®„ØcÕÁGŽŽ¡›U ó½HЃ ecti1000¼Daniel–“°Barlow“(dan@detache–ÿ}/d.demon.c“o.uk)’ª¥ó 1ê± ecrm1000¹v1.17,˜28˜F‘ÿ*¸ebbraio˜1996Ž¡Ÿ&°óŒ6 ecss1000½Questo–fdoGcumento“tratta“la“congurazione“del“compilatoš¸ère“C–f`GNU“e–fdelle“lib˜rerie“di“sviluppGo“sotto“Linux,‘–Qe“fo˜rnisceŽ¡una–KUpano¸èramica“sulla“compilazione,›MKil“link,˜l'esecuzione“e“la“coš¸èrrezione“(debug)“dei“p˜rogrammi.‘nv“e–Õottenere“quello“cš®>he“serv˜e.’#¼ 4ŽŽ¡‘ÿ¹2.1Ž‘%ý¡Questo‘U doGcumen¸èto.‘ö'‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï4ŽŽ¡‘ÿ2.2Ž‘%ý¡Ulteriore‘U doGcumen¸ètazione.‘Ì‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï4ŽŽ¡‘ÿ2.3Ž‘%ý¡GCC‘ðY‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï4ŽŽ¡‘ÿ2.4Ž‘%ý¡Libreria–U C“e“header“le‘v—‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï4ŽŽ¡‘ÿ2.5Ž‘%ý¡Strumen¸èti–U assoGciati“(as,“ld,“ar,“strings,“ecc.)‘rÓ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï5ŽŽ¦Á3Ž‘ÿInstallazione–Õe“impQÂostazione“di“GCC’Ÿ+5ŽŽ¡‘ÿ¹3.1Ž‘%ý¡V‘ÿ*¸ersioni‘U GCC‘ 1…‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï5ŽŽ¡‘ÿ3.2Ž‘%ý¡Do¸èv'€è‘U nito?‘mÛ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï6ŽŽ¡‘ÿ3.3Ž‘%ý¡Do•¸èv“e–U si“tro¸èv‘ÿqÐano“gli“header“le?‘ðÑü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï7ŽŽ¡‘ÿ3.4Ž‘%ý¡Compilazione–U di“cross“compilatori‘¿—‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï7ŽŽ¡‘%ý¡3.4.1Ž‘EûŸLin¸èux–U come“piattaforma“di“destinazione‘é‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï7ŽŽ¦Á4Ž‘ÿIl–ÕpQÂorting“e“la“compilazione’6’W8ŽŽ¡‘ÿ¹4.1Ž‘%ý¡Simš¸èbGoli–U deniti“automaticamen˜te‘j‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï8ŽŽ¡‘ÿ4.2Ž‘%ý¡Chiamata–U del“compilatore‘7#‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï8ŽŽ¡‘%ý¡4.2.1Ž‘EûŸOpzioni–U del“compilatore‘pÝ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï8ŽŽ¡‘%ý¡4.2.2Ž‘EûŸIn¸èternal–U compiler“error:‘q€cc1“got“fatal“signal“11‘Wå‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘wï9ŽŽ¡‘ÿ4.3Ž‘%ý¡P¸èortabilit€àtבü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?10ŽŽ¡‘%ý¡4.3.1Ž‘EûŸBSD–U (inclusi“bsd_ioGctl,“demone“e“ó  b> cmmi10µ<¹sgtt¸èy‘ÿ*¸.hµ>¹)‘^ ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?10ŽŽ¡‘%ý¡4.3.2Ž‘EûŸSegnali–U 'mancan¸èti'“(óqLË ectt1000ÂSIGBUS¹,“ÂSIGEMT¹,“ÂSIGIOT¹,“ÂSIGTRAP¹,“ÂSIGSYS“¹ecc)‘"U‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?10ŽŽŽŽŒ‹* Û_2 ý ~?Ÿ„€ÕÁGŽÁINDICE’¦]!¹2ŽŽ ÕÁ ýV¯‘%ý¡4.3.3Ž‘EûŸCoGdice–U K“&“R‘a ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?10ŽŽ¤ؼ‘%ý¡4.3.4Ž‘EûŸConitto–U dei“sim¸èbšGoli“di“prepro˜cessore“con“prototipi“nel“co˜dice‘ S!‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?11ŽŽ¡‘%ý¡4.3.5Ž‘EûŸÂsprintf()‘5Õ‘ü¹.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?11ŽŽ¡‘%ý¡4.3.6Ž‘EûŸÂfcntl–U ¹e“ani.‘q€Quali“sono“le“denizioni“di“ÂFD_*¹?‘Ê ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?11ŽŽ¡‘%ý¡4.3.7Ž‘EûŸIl–U timeout“di“Âselect()¹.‘q€Programmi“in“busy-w¸èaiting‘ØÕ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?11ŽŽ¡‘%ý¡4.3.8Ž‘EûŸChiamate–U di“sistema“in¸èterrotte‘±é‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?12ŽŽ¡‘%ý¡4.3.9Ž‘EûŸStringhe–U scrivibili“(il“programma“genera“'segmen¸ètation“fault'“in“moGdo“casuale)‘‡‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?13ŽŽ¡‘%ý¡4.3.10Ž‘EûŸP•¸èerc“h€é–U la“c¸èhiamata“Âexecl()“¹fallisce?‘ -‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?14ŽŽ©ØÁ5Ž‘ÿDebugging–Õe“Proling’Mb±14ŽŽ¡‘ÿ¹5.1Ž‘%ý¡Man•¸èutenzione›U prev“en“tiv‘ÿqÐa˜(lin“t)‘›s‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?14ŽŽ¡‘ÿ5.2Ž‘%ý¡Debugging‘Ñ ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?14ŽŽ¡‘%ý¡5.2.1Ž‘EûŸCome–U si“ottengono“le“informazioni“di“debug“in“un“programma?‘èÍ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?14ŽŽ¡‘%ý¡5.2.2Ž‘EûŸSoft•¸èw“are‘U dispGonibile‘~u‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?15ŽŽ¡‘%ý¡5.2.3Ž‘EûŸProgrammi–U bac¸èkground“(demone)]1‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?15ŽŽ¡‘%ý¡5.2.4Ž‘EûŸCore‘U le‘5•‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?16ŽŽ¡‘ÿ5.3Ž‘%ý¡Proling‘f7‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?16ŽŽ¦Á6Ž‘ÿLinking’•^116ŽŽ¡‘ÿ¹6.1Ž‘%ý¡Librerie–U condivise“e“static¸èhe‘b#‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?17ŽŽ¡‘ÿ6.2Ž‘%ý¡Inš¸èterrogazione–U delle“librerie“('In“quale“libreria“si“tro˜v‘ÿqÐa“sin()?')‘ çK‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?17ŽŽ¡‘ÿ6.3Ž‘%ý¡Ricerca–U dei“le‘J§‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?18ŽŽ¡‘ÿ6.4Ž‘%ý¡Compilazione–U delle“proprie“librerie‘ÍÇ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?18ŽŽ¡‘%ý¡6.4.1Ž‘EûŸConš¸ètrollo–U della“v˜ersione‘¿‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?18ŽŽ¡‘%ý¡6.4.2Ž‘EûŸELF.–U Di“cosa“si“tratta?‘bu‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?18ŽŽ¡‘%ý¡6.4.3Ž‘EûŸa.out.‘q€Il–U formato“tradizionale‘j™‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?20ŽŽ¡‘%ý¡6.4.4Ž‘EûŸLinking:‘q€problemi‘U com¸èuni‘19‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?21ŽŽ¡‘ÿ6.5Ž‘%ý¡Loading‘U dinamico‘Ä+‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?22ŽŽ¡‘%ý¡6.5.1Ž‘EûŸConcetti‘®‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?22ŽŽ¡‘%ý¡6.5.2Ž‘EûŸMessaggi–U di“errore‘¨Õ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?22ŽŽ¡‘%ý¡6.5.3Ž‘EûŸCon¸ètrollo–U delle“opGerazioni“del“loader“dinamico‘×Í‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?22ŽŽ¡‘%ý¡6.5.4Ž‘EûŸScriv¸èere–U programmi“con“il“loading“dinamico‘Ðq‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?23ŽŽ¦Á7Ž‘ÿCome–Õcon®>tattare“gli“sviluppatori’Pb24ŽŽ¡‘ÿ¹7.1Ž‘%ý¡Com¸èunicazione–U degli“errori‘S›‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?24ŽŽ¡‘ÿ7.2Ž‘%ý¡Aiuto–U nello“sviluppGo‘’§‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?24ŽŽŽŽŒ‹&O Û_2 ý ~?Ÿ„€ÕÁGŽÁ1.‘ñ8Preliminari’…ðï¹3ŽŽ ÕÁ ýV¯Á8Ž‘ÿUltime‘Õcose’€6E24ŽŽ¤ؼ‘ÿ¹8.1Ž‘%ý¡Ringraziamen¸èti‘Xÿ‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?24ŽŽ¡‘ÿ8.2Ž‘%ý¡T‘ÿ*¸raduzioni‘˜c‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?24ŽŽ¡‘ÿ8.3Ž‘%ý¡Com¸èunicazioni,–U opinioni,“correzioni‘Í÷‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?25ŽŽ¡‘ÿ8.4Ž‘%ý¡Informazioni‘U legali‘Rc‘ü.ŽŽ–Æè‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ“‘ü.ŽŽ‘x?25ŽŽ¤ØÁ9Ž‘ÿRiferimen®>ti–Õin“italiano’K‰ë25ŽŽ¡10Ž‘ÿIndice‘ÕAnalitico’k$c26ŽŽŸ(ÀœÀ1Ž‘ÁPreliminariŽŸèó¥!¢N ecbx1200Ä1.1Ž‘¾Confron to–¸tra“ELF“e“a.outŽŸMª¹Lo– ÅsviluppGo“di“Linš¸èux“si“tro˜v‘ÿqÐa“attualmen˜te“in“uno“stato“di“con˜tin˜ua“ev˜oluzione.‘nBrev˜emen˜te,‘6îesistono“dueŽ¤ ®formati–ëedi“le“binari“cš¸èhe“Lin˜ux“€è“in“grado“di“eseguire,›÷ed“a“seconda“di“come“€è“stato“costruito,˜un“sistemaŽ¡p•Gotrebb“e–U usare“uno“o“l'altro“dei“due.‘q€Leggendo“questo“HO¸èWTO“si“scoprir€à“quale.Ž©ؼP¸èer–XÍriconoscere“il“tipšGo“di“un“binario“€è“p˜ossibile“utilizzare“l'utilitš¸èy“Âfile“¹(ad“esempio:‘xÛÂfile‘?¬/bin/bash¹).‘|ˆP˜erŽ¡un–ƒ?programma“ELF,“dar€à“una“rispšGosta“con•¸ètenen“te–ƒ?ÂELF¹;“p˜er“un“programma“Âa.out“¹la“risp˜osta“sar€à“qualcosaŽ¡del–U tipGo“ÂLinux/i386¹.Ž¦Le–ã«dierenze“tra“ELF‘ãŽe“a.out“sono“descritte“ampiamenš¸ète“in“questo“doGcumen˜to.‘K¯ELF‘㎀è“il“formato“pi€ù“recen˜te,Ž¡generalmen•¸ète›U riten“uto˜il˜migliore.Ž©#ÃÄ1.2Ž‘¾Questioni‘¸amministrativ eŽŸMª¹Informazioni–2Kriguardo“al“cop•¸èyrigh“t–2Ksi“troš¸èv‘ÿqÐano“alla“ne“di“questo“doGcumen˜to,‘i–insieme“a“do˜vute“a˜vv˜ertenzeŽ¡relativš¸èe–§a“certe“stupide“domande“pGoste“su“Usenet,–ÉÕc˜he,“segnalando–§problemi“inesisten˜ti,‘ÉÕriv˜elano“un'ignoranzaŽ¡del–U linguaggio“C.Ž¦Ä1.3Ž‘¾Tip_úograaŽŸMª¹La–nvš¸èersione“in“formato“P˜ostscipt,–´Advi,“o‘nh˜tml,“di–nquesto“doGcumen˜to“ha“una“maggiore“v‘ÿqÐariet€à“tipGogracaŽ¡rispGetto–‹Ia“quella“in“solo“testo.‘úIn“particolare,›˜Ói“nomi“di“le,˜i“comandi,˜l'output“dei“comandi“e“gli“stralci“diŽ¡cošGdice–´Csorgen¸ète“sono“imp˜ostati“con“un“carattere“tip˜o“Âmacchina–?¬da“scrivere¹,‘Ì come–´Cpure“sono“state“messeŽ¡in–U evidenza“le“Â"¹v‘ÿqÐariabiliÂ"“¹ed“altre“parti“cš¸èhe“do˜v˜ev‘ÿqÐano“essere“Áenfatizzate¹.Ž©ؼInoltre,›¯€è–ßùpresen¸ète“un“utile“indice.‘ In“dvi“o“pGostscript,˜la“n¸èumerazione“dell'indice“corrispGonde“a“quella“deiŽ¡paragra.‘»ÞIn–Ã?HTML‘Ã#si“tratta“di“nš¸èumeri“assegnati“sequenzialmen˜te“c˜he“rimandano“ad“altre“parti“del“testo.Ž¡Nella–‡vš¸èersione“a“solo“testo,‘“—si“tratta“solo“di“n˜umeri.‘kSi“consiglia“una“v˜ersione“a˜v‘ÿqÐanzata“piuttosto“c˜he“quellaŽ¡in–U moGdalit€à“testo.Ž¦Negli–+esempi“viene“utilizzata“la“sinš¸ètassi“dell'in˜terprete“dei“comandi“(shell)“Bourne“(al“pGosto“di“quella“C).“GliŽ¡uten¸èti–U di“C-shell“pGotranno“utilizzare“il“comando:ŽŸ´å‘óqLË ectt0900Æ%–¹Nsetenv“FOO“barŽŸؼ¹al–U pGosto“di:ŽŽŽŒ‹Të Û_2 ý ~?Ÿ„€ÕÁGŽÁ2.‘ñ8Do•®>v“e–Õottenere“quello“cš®>he“serv˜e.’!˜¡¹4ŽŽ ÕÁ ýV¯‘Æ$–¹NFOO=bar;“export“FOOŽŸؼ¹Se–¦ril“prompt“mostrato“€è“Â#“¹in•¸èv“ece–¦rdi“Â$¹,‘ºÆil“comando“indicato“probabilmen¸ète“funzioner€à“solo“se“digitato“comeŽ¤ ®ÁroQÂot¹.‘f Naturalmen¸ète,‘;non–4~si“assumere“alcuna“respšGonsabilit€à“p˜er“qualsiasi“cosa“accada“al“sistema“nell'utilizzoŽ¡di–U questi“esempi.ŽŸ(ÀœÀ2Ž‘ÁDo•cv“e–G\ottenere“quello“cšche“serv˜e.ŽŸèÄ2.1Ž‘¾Questo‘¸do_úcumen to.Ž©Mª¹Questo–ÒLdoGcumenš¸èto“fa“parte“della“serie“dei“Lin˜ux“HO˜WTO,“pGertan˜to“si“pu€ò“ottenere“da“tutti“gli“arc˜hivi“diŽ¡Lin•¸èux›šoHO“WTO,˜come˜¼http://sunsite.unc.e–ÿ}/du/pub/linux/do“cs/HO¾˜WTO/˜¹(le˜traduzioni˜italiane˜sono˜dispGoni-Ž¡bili–UJpresso“¼[2]“¹).‘qÿLa“vš¸èersione“HTML‘Uin“inglese“pu€ò“anc˜he“essere“tro˜v‘ÿqÐata“(probabilmen˜te“leggermen˜te“pi€ùŽ¡aggiornata)–U su“¼http://ftp.linux.or–ÿ}/g.uk/b“arlow/howto/gc“c-howto.htmlŽŸؼ¹(traduzione–U italiana“¼[3]“¹).ŽŸ#ÃÄ2.2Ž‘¾Ulteriore‘¸do_úcumen tazione.Ž¦¹La–0ÄdoGcumenš¸ètazione“uciale“di“gcc“si“tro˜v‘ÿqÐa“nella“distribuzione“sorgen˜te“(si“v˜eda“sotto)“sotto“forma“di“leŽ¡texinfo,‘›e–wcome“le“Â.info¹.‘†Se“si“dispšGone“di“una“connessione“di“rete“v¸èelo˜ce,‘›un“cd-rom“o“una“buona“dose“diŽ¡pazienza,‘—΀è–ŠxpGossibile“eseguirne“l'Âuntar“¹e“copiare“le“parti“rilev‘ÿqÐanš¸èti“in“Â/usr/info¹.‘‰In“caso“con˜trario,‘—ÎpGossonoŽ¡essere–übtroš¸èv‘ÿqÐati“presso“¼ftp://tsx-11.mit.e–ÿ}/du:/pub/linux/p“ackages/GCC/–üb¹,‘&3ma“non“necessariamen˜te“si“tratter€àŽ¡della–U vš¸èersione“pi€ù“recen˜te.ŽŸؼEsistono–Zˆdue“sorgenš¸èti“di“doGcumen˜tazione“pšGer“lib˜c.‘¸La“GNU‘ZElib˜c“conš¸ètiene“dei“le“info“c˜he“descriv˜ono“pi-Ž¡uttosto–Paccuratamenš¸ète“la“libGc“Lin˜ux,›ŽÀfatta“eccezione“pGer“stdio.‘b3Inoltre,˜le“pagine“di“manš¸èuale“dell'arc˜hiv-Ž¡io›2¼ftp://sunsite.unc.e–ÿ}/du/pub/Linux/do“cs/˜¹sono˜state˜scritte˜pGer˜Lin•¸èux˜e˜descriv“ono˜n“umerose˜c“hiamate˜diŽ¡sistema–U (sezione“2)“e“funzioni“libGc“(sezione“3).ŽŸ#ÃÄ2.3Ž‘¾GCCŽ¦¹La––ýdistribuzione“uciale“del“GCC‘–ÍLinš¸èux“pu€ò“sempre“essere“tro˜v‘ÿqÐata“in“formato“binario“(gi€à“compilato)“all'ind-Ž¡irizzo›®È¼ftp://tsx-11.mit.e–ÿ}/du:/pub/linux/p“ackages/GCC/˜¹.‘:Nel˜momen•¸èto˜in˜cui˜viene˜scritto˜questo˜doGcumen“to,Ž¡la–U vš¸èersione“pi€ù“recen˜te“€è“la“¼2.7.2‘°¹(Âgcc-2.7.2.bin.tar.gz¹).Ž©ؼ€È‘ù\pGossibile–ú ottenere“la“distribuzione“sorgenš¸ète“pi€ù“recen˜te“di“GCC‘ù\fornita“dalla“F‘ÿ*¸ree“Soft˜w˜are“F‘ÿ*¸oun-Ž¡dation–çÖdagli“arc¸èhivi“¼ftp://pr–ÿ}/ep.ai.mit.e“du/pub/gnu/–çÖ¹.‘)¡I›æêgestori“del“GCC˜Lin¸èux“hanno“reso“moltoŽ¡semplice–¾Œla“compilazione“dell'ultima“vš¸èersione“-“il“programma“di“congurazione“(Âconfigure¹)“do˜vrebbGeŽ¡impGostare–˃tutto“da“solo.‘Ô©Si“v•¸èeric“hi›˃anc“he˜l'ev“en“tuale˜presenza˜di˜patc“h˜da˜applicare˜presso:Ž¡¼ftp://tsx-11.mit.e–ÿ}/du:/pub/linux/p“ackages/GCC/‘U ¹.Ž¦Pš¸èer–&Zcompilare“qualcosa“di“non“banale“(ma“anc˜he“alcune“cose“banali)“sar€à“necessario“pGossedere“anc˜he“quan˜toŽ¡descritto–U nel“paragrafo“c¸èhe“segue.ŽŸ#ÃÄ2.4Ž‘¾Libreria–¸C“e“header“leŽŸMª¹Quello–U cš¸èhe“si“desidera“a“questo“pun˜to“dipGende“da“due“fattori:ŽŸؼ‘ 9b1.ŽŽŽ‘se–U il“proprio“sistema“€è“ELF“oppure“a.outŽŽŽŒ‹fÊ Û_2 ý ~?Ÿ„€ÕÁGŽÁ3.‘ñ8Installazione–Õe“impQÂostazione“di“GCC’{¿¹5ŽŽ ÕÁ ýV¯‘ 9b2.ŽŽŽ‘quale–U dei“due“si“desidera“a•¸èv“ere.Ž©þ…Se–¥Ùsi“sta“passando“da“libšGc“4“a“lib˜c“5,‘ºsi“raccomanda“di“leggere“l'“¼ELF-HO¾˜WTO‘¥Ä¹,“rin¸ètracciabile“pi€ù“o“menoŽŸ ®nello–U stesso“luogo“in“cui“€è“stato“troš¸èv‘ÿqÐato“questo“doGcumen˜to“(traduzione“italiana“¼[1]“¹).Ž¤ؼDa‘U ¼ftp://tsx-11.mit.e–ÿ}/du:/pub/linux/p“ackages/GCC/Ž¡¹sono‘U dispGonibili:Ž¦ÁlibQÂc-5.2.18.bin.tar.gzŽŽŽ¤‚o‘¹Immagini–U di“librerie“condivise“ELF,“librerie“staticš¸èhe“e“le“include“pGer“le“librerie“C“e“matematic˜he.Ž©VÊÁlibQÂc-5.2.18.tar.gzŽŽŽ¡‘¹Sorgenš¸èti–§ÂpGer“quan˜to“descritto“sopra.‘igSar€à“necessario“anc˜he“il“pacc˜hetto“Â.bin.›ig¹pGer“gli“header“le.˜SeŽ¤ ®‘si–>Û€è“indecisi“tra“compilarsi“in“proprio“la“libreria“C‘>Ÿo“utilizzare“il“formato“binario,‘yJla“scelta“miglioreŽ¡‘consiste–ˆ´nell'usare“il“cošGdice“gi€à“compilato.‘ ;Nel“caso“in“cui“si“desideri“il“supp˜orto“NIS‘ˆ¦o“p˜er“le“shado¸èwŽ¡‘passwš¸èord–U di“do˜vr€à“com˜unque“gestirli“in“prima“pGersona.Ž¦ÁlibQÂc-4.7.5.bin.tar.gzŽŽŽŸ‚o‘¹Immagini–×Ïdi“libreria“condivisa“Âa.out“¹e“librerie“staticš¸èhe“pGer“la“v˜ersione“4.7.5“della“libreria“C‘×­e“simili.Ž¡‘Questo–²Z€è“stato“studiato“pšGer“co˜esistere“con“il“pacc¸èhetto“lib˜c“5“sopra“menzionato,‘ɨma“€è“necessario“soloŽ¡‘se–U si“desidera“con•¸ètin“uare–U a“utilizzare“o“sviluppare“programmi“in“formato“a.out.ŽŸ"ø1Ä2.5Ž‘¾Strumen ti–¸asso_úciati“(as,“ld,“ar,“strings,“ecc.)Ž©Mª¹Si–‚âpGossono“tro¸èv‘ÿqÐare“su“¼ftp://tsx-11.mit.e–ÿ}/du:/pub/linux/p“ackages/GCC/–‚â¹,‘¬ïcome“ogni“altra“cosa“sinora“descritta.Ž¡La–U vš¸èersione“corren˜te“€è“Âbinutils-2.6.0.2.bin.tar.gz¹.ŽŸؼLe–®¾binš¸èutils“sono“dispGonibili“unicamen˜te“in“ELF,“la“v˜ersione“corren˜te“di“libGc“si“tro˜v‘ÿqÐa“in“ELF‘®“ed“inoltre“€è“meglioŽ¡utilizzare–çÙla“v¸èersione“a.out“di“libšGc“in“congiunzione“con“una“ELF.“Lo“svilupp˜o“della“libreria“C‘ç½si“sta“m•¸èuo“v“endoŽ¡vš¸èerso–U ELF:“se“non“c'€è“un“particolare“motiv˜o“pGer“l'utilizzo“di“a.out,“si“consiglia“di“fare“altrettan˜to.ŽŸ(› À3Ž‘ÁInstallazione–G\e“imppœostazione“di“GCCŽŸèÄ3.1Ž‘¾V‘þàersioni‘¸GCCŽ¦¹€È›Ï#pGossibile–Ï„scoprire“quale“v¸èersione“GCC˜si“sta“eseguendo“digitando“Âgcc‘?¬-v“¹alla“ricš¸èhiesta“dell'in˜terpreteŽ¡comandi.‘šCSi–b¶tratta“di“un“metošGdo“piuttosto“adabile“anc¸èhe“p˜er“scoprire“se“la“propria“imp˜ostazione“€è“ELF‘b³oŽ¡a.out.‘q€Il–U risultato“p•Gotrebb“e‘U essere:ŽŸÚ®‘Æ$–¹Ngcc“-vŽ¤ Š=‘Reading–¹Nspecs“from“/usr/lib/gcc-lib/i486-box-linux/2.7.2/specsŽ¡‘gcc–¹Nversion“2.7.2Ž¤þ…¹Le–U cose“da“notare“sono:Ž¡Ái486ŽŽŽŸ‚o‘¹Indica–jc¸èhe“il“gcc“€è“stato“compilato“pšGer“un“pro˜cessore“486“-“altre“p˜ossibilit€à“sono“386“o“586.‘°ST‘ÿ*¸uttiŽ¤ ®‘i–8«prošGcessori“p˜ossono“eseguire“il“co˜dice“compilato“p˜er“ciascuna“delle“altre“v¸èersioni;‘ªqla“dierenza“con-Ž¡‘siste–1¬nell'ottimizzazione“c¸èhe“non“ha“eetti“sulle“prestazioni“in“un“386,‘hÏma“rende“il“coGdice“eseguibileŽ¡‘leggermen¸ète–U pi€ù“grande.ŽŽŽŒ‹sú Û_2 ý ~?Ÿ„€ÕÁGŽÁ3.‘ñ8Installazione–Õe“impQÂostazione“di“GCC’{¿¹6ŽŽ ÕÁ ýV¯ÁbQÂo®>xŽŽŽ©“K‘¹Non–Ê€è“aatto“imp•Gortanš¸ète,‘.4p“otrebb“e–Êesserci“qualcosa“di“div˜erso“(come“Âslackware“¹o“Âdebian¹)“o“anc˜heŽ¤ ®‘nš¸èulla–qó(in“tal“caso,‘¹(il“nome“di“directory“completa“sar€à“Âi486-linux¹).‘ÇùSe“si“esegue“pGersonalmen˜te“laŽ¡‘compilazione–Ÿôdi“gcc,‘²©€è“pšGossibile“imp˜ostare“questa“caratteristica“al“momen¸èto“della“compilazione,‘²©a“niŽ¡‘puramen¸ète‘U estetici.ŽŸx‚Álin®>uxŽŽŽ¦‘¹In›…alternativ‘ÿqÐa,‘Ñp•Gotrebb“e˜essere˜Âlinuxelf˜¹o˜Âlinuxaout¹,‘Ñil˜signicato˜v‘ÿqÐaria˜a˜seconda˜della˜v¸èersioneŽ¡‘utilizzata,–U fatto“c¸èhe“p•Gotrebb“e–U confondere“le“idee.ŽŸ]¹‘Álin®>uxŽŽŽ¤“K‘/¹signica–U ELF“se“la“vš¸èersione“€è“la“2.7.0“o“seguen˜te,“altrimen˜ti“signica“a.out.Ž©x‚‘Álin®>uxaoutŽŽŽ¡‘/¹signica–¢ßa.out.‘Z½€È‘¢Ëstato“in¸ètrošGdotto“quando“la“denizione“di“Âlinux“¹€è“stata“mo˜dicata“da“a.out“inŽŸ ®‘/ELF,–U in“mošGdo“c¸èhe“non“sia“p˜ossibile“vš¸èedere“un“gcc“Âlinuxaout“¹pi€ù“v˜ecc˜hio“della“v˜ersione“2.7.0.Ž¦‘Álin®>uxelfŽŽŽ¡‘/¹€è–|.obsoleto.‘æªSi“tratta“generalmenš¸ète“di“una“v˜ersione“di“gcc“2.6.3“impšGostata“p˜er“pro˜durre“eseguibiliŽ¤ ®‘/ELF.–†Si“noti“cš¸èhe“il“gcc“2.6.3“con˜tiene“degli“errori“nella“prošGduzione“di“co˜dice“p˜er“ELF‘u-“si“consigliaŽ¡‘/un‘U aggiornamen¸èto.ŽŸ]¹Á2.7.2ŽŽŽŸ“K‘¹nš¸èumero–U della“v˜ersione.Ž©RÎIn–U conclusione,“si“tratta“di“gcc“2.7.2“c¸èhe“prošGduce“del“co˜dice“ELF.ŽŸ#´Ä3.2Ž‘¾Do v'€è‘¸nito?ŽŸMª¹Se–„5gcc“€è“stato“installato“senza“prestare“attenzione,‘­ýoppure“se“€è“stato“otten¸èuto“come“parte“di“una“distribuzione,Ž¡p•Gotrebb“e–U essere“necessario“scoprire“do•¸èv“e–U si“troš¸èv‘ÿqÐa“all'in˜terno“del“lesystem.‘q€Le“parti“c˜hia˜v˜e“sono:Ž¦‘ó !",š cmsy10¸ŽŽŽ‘Â/usr/lib/gcc-lib/ÁdestinazioneÂ/Áv®>ersioneÂ/–ü¹(e“sottošGdirectory)“p˜osto“in“cui“si“tro¸èv‘ÿqÐa“la“maggior“parteŽ¡‘del–K¡compilatore,›‰Bi“programmi“eseguibili“c¸èhe“eettuano“la“compilazione,˜alcune“librerie“e“le“includeŽ¡‘sp•Gecici›U p“er˜la˜v•¸èersione˜c“he˜si˜sta˜utilizzando.ŽŸx‚‘¸ŽŽŽ‘Â/usr/bin/gcc–P˜¹drivš¸èer“del“compilatore“-“la“parte“c˜he“si“esegue“dalla“riga“di“comando.‘¨Pu€ò“essere“utilizzatoŽ¡‘con–iÖdivš¸èerse“v˜ersioni“di“gcc,‘˜åa“patto“c˜he“siano“state“installate“pi€ù“directory“di“compilatore“(come“descrittoŽ¡‘sopra).‘EûPš¸èer–Òscoprire“la“v˜ersione“predenita,‘ì­digitare“Âgcc‘?¬-v¹.‘EûP˜er“forzare“un'altra“v˜ersione,‘ì­digitare“ÂgccŽ¡‘-V–U Áv®>ersione¹.‘q€A¸èd“esempio:ŽŸ9â‘/Æ#–¹Ngcc“-vŽ¤ Š=‘/Reading–¹Nspecs“from“/usr/lib/gcc-lib/i486-box-linux/2.7.2/specsŽ¡‘/gcc–¹Nversion“2.7.2Ž¡‘/#–¹Ngcc“-V“2.6.3“-vŽ¡‘/Reading–¹Nspecs“from“/usr/lib/gcc-lib/i486-box-linux/2.6.3/specsŽ¡‘/gcc–¹Ndriver“version“2.7.2“executing“gcc“version“2.6.3ŽŸ]¹‘¸ŽŽŽ‘Â/usr/ÁdestinazioneÂ/(bin¸jÂlib¸jÂinclude)/¹.‘ûSe–Isono“stati“installati“pi€ù“destinazioni“(target)“(ad“esem-Ž¤ ®‘pio,›à¸a.out–ÄÍed“elf,˜o“un“cross“compilatore“di“qualc¸èhe“tipGo),˜le“librerie,˜le“bin¸èutils“(come“Âas¹,˜Âld“¹o“altri)Ž¡‘e–‡Bgli“header“le“pšGer“destinazioni“non“nativ¸èe“p˜ossono“essere“tro¸èv‘ÿqÐati“in“questa“p˜osizione.‘æSe“€è“statoŽ¡‘installato–ëÏun“solo“tipšGo“di“gcc,‘ßdiv¸èerse“parti“di“esso“sono“p˜oste“o“in“questa“directory“o,‘ßalternativ‘ÿqÐamen¸ète,Ž¡‘in‘U Â/usr/(bin¸jÂlib¸jÂinclude)¹.ŽŽŽŒ‹€ Û_2 ý ~?Ÿ„€ÕÁGŽÁ3.‘ñ8Installazione–Õe“impQÂostazione“di“GCC’{¿¹7ŽŽ ÕÁ ýV¯‘¸ŽŽŽ‘Â/lib/¹,‘övÂ/usr/lib–¢þ¹e“altre“sono“directory“di“libreria“pGer“il“sistema“nativš¸èo.‘[Sar€à“anc˜he“necessaria“laŽ¤ ®‘directory–¶Â/lib/cpp“¹pšGer“molte“applicazioni“(ad“esempio“X‘µòne“fa“un“grande“utilizzo)“-“€è“p˜ossibile“copiarlaŽ¡‘da–U Â/usr/lib/gcc-lib/destinazione/versione/“¹o“creare“un“collegamenš¸èto“(link)“sim˜bGolico.Ž©"äîÄ3.3Ž‘¾Do• v“e–¸si“tro v‘ÿ@ ano“gli“header“le?ŽŸMª¹IndipšGenden•¸ètemen“te–pdalla“p˜osizione“in“cui“sono“stati“installati“i“propri,›vÂsotto“Â/usr/local/include¹,˜esistonoŽ¡tre–U sorgenš¸èti“principali“degli“header“le“in“Lin˜ux:ŽŸŽ©‘¸ŽŽŽ‘¹la–·°maggior“parte“di“Â/usr/include/“¹e“relativš¸èe“subGdirectory“sono“sostituiti“con“il“pacc˜hetto“binario“diŽ¡‘libšGc–µ0da“H.“J.“Lu.‘‘¯In“tali“p˜osizioni“si“p˜otrebb˜ero“ancš¸èhe“tro˜v‘ÿqÐare“le“da“altri“sorgen˜ti“(librerie“Ácurses“¹eŽ¡‘Ádbm¹,‘sad–üÈesempio)“spšGecialmen¸ète“se“si“sta“utilizzando“la“distribuzione“lib˜c“pi€ù“recenš¸ète“(c˜he“non“con˜tieneŽ¡‘curses–U o“dbm,“come“in•¸èv“ece–U accadev‘ÿqÐa“nelle“pi€ù“v•¸èecc“hie).ŽŸ* ‘¸ŽŽŽ‘Â/usr/include/linux–ü¹e“Â/usr/include/asm“¹(pšGer“i“le“µ<Âlinux/*.hµ>“¹e“µ<Âasm/*.hµ>¹)“do¸èvrebb˜ero“essereŽ¡‘link–Nsimš¸èbGolici“alle“directory“Âlinux/include/linux“¹e“Âlinux/include/asm“¹nella“distribuzione“sorgen˜teŽ¡‘del–½pk¸èernel.‘ªo€È‘½Unecessario“installarli“se“si“pšGensa“di“eseguire“lo“svilupp˜o“di“un“qualsiasi“programma“nonŽ¡‘banale;‘êlnon–cRservš¸èono“solo“pGer“la“compilazione“del“k˜ernel.‘œP˜otrebbGe“essere“anc˜he“necessario“eseguireŽ¡‘il–ðŸÂmake‘?¬config“¹nelle“directory“del“kš¸èernel“dopGo“a˜v˜er“scaricato“i“sorgen˜ti.‘ CüMolti“le“dipGendono“daŽ¡‘µ<Âlinux/autoconf.hµ>–Èܹcš¸èhe“p•Gotrebb“e–ÈÜnon“esistere,‘äêe“in“alcune“v˜ersioni“di“k˜ernel,‘äêÂasm“¹€è“un“link“sim˜bGolicoŽ¡‘cš¸èhe–:Oviene“creato“al“momen˜to“del“Âmake‘?¬config¹.‘!P˜ertan˜to,‘s›se“si“scaricano“i“sorgen˜ti“del“k˜ernel“sottoŽ¡‘Â/usr/src/linux¹:ŽŸÄ2‘/Æ$–¹Ncd“/usr/src/linuxŽ¤ Š=‘/$‘¹NsuŽ¡‘/#–¹Nmake“configŽ¡‘/[rispondere–¹Nalle“domande.“A“meno“che“non“si“abbia“intenzione“diŽ¡‘3¹Pproseguire–¹Ncon“la“compilazione“del“kernel,“la“risposta“non“haŽ¡‘3¹Pmolta‘¹Nimportanza]Ž¡‘/#–¹Ncd“/usr/includeŽ¡‘/#–¹Nln“-s“../src/linux/include/linux“.Ž¡‘/#–¹Nln“-s“../src/linux/include/asm“.ŽŸ¦‘¸ŽŽŽ‘¹File– ïåcome“µ<Âfloat.hµ>¹,–––µ<Âlimits.hµ>¹,“µ<Âvarargs.hµ>¹,“µ<Âstdarg.hµ>– ïå¹e“µ<Âstddef.hµ>Ž¤ ®‘¹v‘ÿqÐariano–RKa“seconda“della“vš¸èersione“del“compilatore,‘‘–pGertan˜to“si“tro˜v‘ÿqÐano“inŽ¡‘Â/usr/lib/gcc-lib/i486-box-linux/2.7.2/include/–U ¹e“pGosizioni“simili.Ž¦Ä3.4Ž‘¾Compilazione–¸di“cross“compilatoriŽ¤MªÁ3.4.1Ž‘#!\Lin®>ux–Õcome“piattaforma“di“destinazioneŽ¡¹SuppGonendo–edi“a•¸èv“er›eotten“uto˜il˜coGdice˜sorgen“te˜pGer˜gcc,‘•solitamen“te˜€è˜sucien“te˜seguire˜le˜istruzioni˜con“ten“uteŽ¤ ®nel–Œtle“ÂINSTALL›Œf¹di“GCC.“Un“comando“Âconfigure–?¬-target=i486-linux“-host=XXX˜¹sulla–Œtpiattaforma“ÂXXXŽ¡¹seguito–ªìda“un“Âmake“¹doš¸èvrebbGe“funzionare.‘rãSi“noti“c˜he“saranno“necessari“gli“include“di“Lin˜ux,‘À_gli“include“delŽ¡kš¸èernel–„îe“sar€à“necessario“eseguire“anc˜he“la“compilazione“del“cross“assem˜bler“e“del“cross“link˜er“dai“sorgen˜ti“inŽ¡¼ftp://tsx-11.mit.e–ÿ}/du/pub/linux/p“ackages/GCC/‘U ¹.ŽŸ @ÁLinš®>ux–Ã,come“piattaforma“sorgen˜te,‘ þ±MSDOS‘Áècome“destinazione‘ ÿ`¹Apparen•¸ètemen“te‘ž–do“vrebbGeŽ¡essere–ìpGossibile“utilizzando“il“paccš¸èhetto“emx“o“l'extender“go.‘6cSi“in˜vita“a“dare“un'oGcc˜hiata“aŽ¡¼ftp://sunsite.unc.e‘ÿ}/du/pub/Linux/devel/msdos‘U ¹.ŽŸؼL'autore,–U non“ha“ancora“vš¸èericato“le“funzionalit€à“e“pGertan˜to“non“pu€ò“dare“alcuna“garanzia“in“merito.ŽŽŽŒ‹Žw Û_2 ý ~?Ÿ„€ÕÁGŽÁ4.‘ñ8Il–ÕpQÂorting“e“la“compilazione’4në¹8ŽŽ ÕÁ ýV¯À4Ž‘ÁIl–G\ppœorting“e“la“compilazioneŽŸèÄ4.1Ž‘¾Simš b_úoli–¸deniti“automaticamen˜teŽŸMª¹€È‘’pšGossibile–’Lelencare“i“sim¸èb˜oli“deniti“automaticamenš¸ète“dalla“propria“v˜ersione“di“gcc“eseguendolo“con“l'opzioneŽ© ®Â-v¹.‘q€A¸èd‘U esempio:ŽŸ´å‘Æ$–¹Necho“'main(){printf("hello“world\n");}'“|“gcc“-E“-v“-Ž¤ Š=‘Reading–¹Nspecs“from“/usr/lib/gcc-lib/i486-box-linux/2.7.2/specsŽ¡‘gcc–¹Nversion“2.7.2Ž¡‘/usr/lib/gcc-lib/i486-box-linux/2.7.2/cpp–¹N-lang-c“-v“-undefŽ¡‘-D__GNUC__=2–¹N-D__GNUC_MINOR__=7“-D__ELF__“-Dunix“-Di386“-DlinuxŽ¡‘-D__ELF__–¹N-D__unix__“-D__i386__“-D__linux__“-D__unix“-D__i386Ž¡‘-D__linux–¹N-Asystem(unix)“-Asystem(posix)“-Acpu(i386)Ž¡‘-Amachine(i386)–¹N-D__i486__“-ŽŸؼ¹Se–˜ñsi“sta“scrivš¸èendo“del“coGdice“c˜he“utilizza“delle“caratteristic˜he“spGecic˜he“pGer“Lin˜ux,‘¾”€è“una“buona“idea“includereŽ¦le–U parti“non“pGortabili“inŽŸ´å‘Æ#ifdef‘¹N__linux__Ž¡‘/*–¹N...“altro“codice“...“*/Ž¡‘#endif–¹N/*“linux“*/ŽŸؼ¹Si–îÓutilizzi“Â__linux__“¹pšGer“questo“scop˜o,‘?Ánon“¹semplicemen¸ète“Âlinux¹.‘>˜Sebb˜ene“anc¸èhe“il“secondo“sia“denito,Ž¦non–U €è“conforme“a“POSIX.ŽŸ#ÃÄ4.2Ž‘¾Chiamata–¸del“compilatoreŽ¤Mª¹La–ØkdošGcumen¸ètazione“p˜er“le“opzioni“del“compilatore“€è“rappresen¸ètata“dalla“info“page“di“gcc“(in“Emacs,‘ñ\si“utilizziŽ¦ÂC-h‘?¬i–ܸ¹quindi“si“selezioni“la“v¸èošGce“'gcc').‘IIl“proprio“distributore“p˜otrebb˜e“non“a•¸èv“er–ܸincluso“questa“parte“nelŽ¦sistema,‘©o– ‹la“vš¸èersione“c˜he“si“pšGossiede“p˜otrebb˜e“essere“v•¸èecc“hia;‘"½la– ‹cosa“migliore“da“fare“in“questo“caso“consisteŽ¦nello–U scaricare“l'arcš¸èhivio“sorgen˜te“gcc“da“¼ftp://pr–ÿ}/ep.ai.mit.e“du/pub/gnu–U ¹o“da“uno“dei“suoi“siti“mirror.ŽŸؼLa–Rpagina“di“manš¸èuale“gcc“(Âgcc.1¹)“di“solito“€è“obsoleta.‘pwT‘ÿ*¸en˜tando“di“leggerla“si“tro˜v˜er€à“questo“a˜vv˜ertimen˜to.ŽŸ ÖÁ4.2.1Ž‘#!\Opzioni–Õdel“compilatoreŽ¡¹L'output–ÜÞdi“gcc“pu€ò“essere“ottimizzato“aggiungendo“Â-OÁn“¹alla“sua“riga“di“comando,‘>Îdo•¸èv“e–ÜÞÁn“¹rappresen¸ètaŽ¦un–Q‹in¸ètero“opzionale.‘fÁI‘QJv‘ÿqÐalori“signicativi“di“Án¹,›¦ed“il“loro“esatto“eetto,˜v‘ÿqÐariano“a“seconda“della“v¸èersione;Ž¦tipicamen¸ète–8Ov‘ÿqÐanno“da“0“(nessuna“ottimizzazione)“a“2“(molte“ottimizzazioni)“a“3“(moltissime“ottimizzazioni).ŽŸؼIn•¸èternamen“te,‘IGgcc–FQle“traduce“in“una“serie“di“opzioni“Â-f“¹e“Â-m¹.‘l€È‘FMpGossibile“vš¸èedere“esattamen˜te“quale“liv˜ello“Â-OŽ¦¹si–ê¥lega“a“ogni“opzione“eseguendo“Âgcc–?¬-v“-Q–ꊹ(ÂQ“¹€è–ê¥un'opzione“non“doGcumen•¸ètata).‘NA“d–ê¥esempio,‘ÿñ-O2“sul“sistemaŽ¦dell'autore–U proGduce“questo“risultato:ŽŸ´å‘Æenabled:‘%Êp-fdefer-pop–¹N-fcse-follow-jumps“-fcse-skip-blocksŽ¤ Š=‘Q¯ª-fexpensive-optimizationsŽ¡‘Q¯ª-fthread-jumps–¹N-fpeephole“-fforce-mem“-ffunction-cse“-finlineŽ¡‘Q¯ª-fcaller-saves–¹N-fpcc-struct-return“-frerun-cse-after-loopŽ¡‘Q¯ª-fcommon–¹N-fgnu-linker“-m80387“-mhard-float“-mno-soft-floatŽ¡‘Q¯ª-mno-386–¹N-m486“-mieee-fp“-mfp-ret-in-387ŽŽŽŒ‹ Ê Û_2 ý ~?Ÿ„€ÕÁGŽÁ4.‘ñ8Il–ÕpQÂorting“e“la“compilazione’4në¹9ŽŽ ÕÁ ýV¯L'utilizzo–ëdi“un“livš¸èello“di“ottimizzazione“maggiore“di“quan˜to“previsto“pGer“il“proprio“compilatore“(ad“esempio,Ž¤ ®-O6)–¥ëaš¸èvr€à“lo“stesso“risultato“c˜he“utilizzare“il“liv˜ello“pi€ù“alto“c˜he“€è“in“grado“di“suppGortare.‘câT‘ÿ*¸utta˜via,‘úlaŽ¡distribuzione–iÉdi“cošGdice“imp˜ostato“p˜er“la“compilazione“in“questo“mo˜do“non“€è“una“buona“idea“-“se“in“v¸èersioniŽ¡future–U saranno“incorpšGorate“ulteriori“ottimizzazioni,“p˜otrebb˜e“accadere“cš¸èhe“in˜terrompano“il“proprio“coGdice.Ž©ؼGli–ã/utenš¸èti“di“gcc“dalla“v˜ersione“2.7.0“no“alla“2.7.2“do˜vrebbGero“notare“c˜he“esiste“un“errore“in“-O2.‘ ¬InŽ¡particolare,‘ú'Á-fstrengh®>t-reduction¹'–¥Ønon“funziona.‘c©€È‘¥dispšGonibile“una“patc¸èh“p˜er“risolv¸èere“questo“proble-Ž¡ma,›Ñ»c¸èhe–¸Ïnecessita“della“ricompilazione“del“gcc,˜altrimenš¸èti“€è“sucien˜te“assicurarsi“di“usare“sempre“l'opzioneŽ¡Â-fno-strength-reduce¹.ŽŸ ÖÁOpzioni–›ŒspšQÂecic®>he“p˜er“il“pro˜cessore‘ ÿ`¹Esistono–#altre“opzioni“Â-m“¹c¸èhe“non“sono“attiv‘ÿqÐate“da“nessun“Â-O¹,“e“siŽ¡dimostrano–s3utili“in“molti“casi.‘&2Le“principali“sono“Â-m386“¹e“Â-m486¹,‘ ccš¸èhe“indicano“a“gcc“di“fa˜v˜orire“rispGettiv‘ÿqÐamen˜teŽ¡386–"§o“486.‘`­Il“coGdice“compilato“con“una“di“queste“due“opzioni“funzioner€à“ancš¸èhe“su“macc˜hine“dell'altro“tipGo;‘3zilŽ¡coGdice–U 486“€è“pi€ù“vš¸èoluminoso,“ma“non“€è“pi€ù“len˜to“se“eseguito“su“386.Ž¦A•¸èttualmen“te–non“esiste“un'opzione“Â-mpentium“¹o“Â-m586¹.‘ žLin¸èus“suggerisce“di“utilizzare“Â-m486Ž¡-malign-loops=2–?¬-malign-jumps=2“-malign-functions=2¹,‘¢IpšGer–_§ottenere“l'ottimizzazione“del“co˜dice“486Ž¡ma–Ó“senza“i“salti“necessari“pšGer“l'allineamen¸èto“(di“cui“il“p˜enš¸ètium“non“ha“bisogno).‘ìÙMic˜hael“Meissner“(diŽ¡Cygn¸èus)‘U dice:Ž©ؼ‘'ÿLa–½mia“impressione“€è“cš¸èhe“Â-mno-strength-reduce“¹proGduca“anc˜he“un“coGdice“pi€ù“v˜eloGce“sul-Ž¡‘l'x86––­(si“noti“cš¸èhe“non“mi“sto“riferendo“all'errore“relativ˜o“all'opzione“'-fstrength-reduction':‘ô›altraŽ¡‘questione).‘—ÛCi€ò–aé€è“do¸èvuto“alla“carenza“di“registri“dell'x86“(ed“il“metoGdo“di“GCC‘aædi“raggruppare“iŽ¡‘registri–¥£in“registri“sparsi“piuttosto“c¸èhe“in“altri“registri“non“aiuta“molto).‘c'Âstrenght-reduce¹'“haŽ¡‘come–ïæeetto“l'utilizzo“di“registri“addizionali“pšGer“sostituire“moltiplicazioni“con“addizioni.‘OÂSosp˜ettoŽ¡‘anc•¸èhe›U c“he˜Â-fcaller-saves˜¹p•Gossa˜causare˜una˜p“erdita˜di˜prestazioni.Ž¦‘'ÿUn'altra–€fconsiderazione“consiste“nel“fatto“c¸èhe“Â-fomit-frame-pointer“¹pGossa“o“meno“rappre-Ž¡‘senš¸ètare–CHun“v‘ÿqÐan˜taggio.‘kDa“un“lato,‘FÚrende“dispšGonibile“un“altro“registro“p˜er“l'uso;‘I;tutta¸èvia,‘FÚil“mo˜doŽ¡‘in–,cui“x86“cošGdica“il“suo“set“di“istruzioni“comp˜orta“cš¸èhe“gli“indirizzi“relativi“di“stac˜k“oGccupino“pi€ùŽ¡‘spazio–&JrispšGetto“agli“indirizzi“relativi“di“frame;‘5ædi“conseguenza,‘/¨sar€à“disp˜onibile“ai“programmi“unaŽ¡‘quan•¸ètit€à›íW(leggermen“te)˜inferiore˜di˜Icac“he.‘:%Inoltre,‘eÂ-fomit-frame-pointer˜¹implica˜il˜con“tin“uoŽ¡‘aggiustamenš¸èto–Üjdel“pun˜tatore“allo“stac˜k“da“parte“del“compilatore,‘þternal–Õcompiler“error:‘ cc1“got“fatal“signal“11ŽŸMª¹(Ovv•¸èero:‘q€Errore›U in“terno˜del˜compilatore:‘q€cc1˜ha˜ricevuto˜il˜segnale˜fatale˜11).Ž©ؼIl–Пsegnale“11“€è“SIGSEGV,“o“'segmenš¸ètation“violation'.‘ãþSolitamen˜te“signica“c˜he“il“programma“ha“confuso“iŽ¡punš¸ètatori–†¢e“ha“ten˜tato“di“scriv˜ere“su“una“pGorzione“di“memoria“c˜he“non“p•Gossedev‘ÿqÐa.‘P˜otrebb“e–†¢trattarsi“di“unŽ¡errore–U di“gcc.Ž¦T‘ÿ*¸uttaš¸èvia,‘~#gcc–B¼€è“bGen“v˜ericato“ed“adabile,‘~#nella“maggior“parte“dei“casi.‘:UUtilizza“anc˜he“un“gran“n˜umeroŽ¡di–strutture“dati“complesse,‘4e“una“grande“quanš¸ètit€à“di“pun˜tatori.‘ˆIn“brev˜e,‘4€è“il“miglior“tester“di“RAM‘QtraŽ¡quelli–-dispšGonibili“com•¸èunemen“te.‘·§Se–-non“€è“p˜ossibile“replicare“l'errore“-“il“sistema“non“si“ferma“nello“stessoŽŽŽŒ‹ ª% Û_2 ý ~?Ÿ„€ÕÁGŽÁ4.‘ñ8Il–ÕpQÂorting“e“la“compilazione’/o;¹10ŽŽ ÕÁ ýV¯punš¸èto–Ilquando“si“ria˜vvia“la“compilazione“-“molto“probabilmen˜te“si“tratta“di“un“problema“legato“all'hardw˜areŽ¤ ®(CPU,–Ï-memoria,‘í°scš¸èheda“madre“o“cac˜he).‘ߧNon“lo“si“dev˜e“considerare“un“errore“del“compilatore“solo“pGerc˜h€éŽ¡il–1proprio“computer“supGera“i“conš¸ètrolli“di“a˜vvio“del“sistema“o“€è“in“grado“di“eseguire“Windo˜ws“o“qualunqueŽ¡altro–¤²programma;‘ßquesti“'test'“sono“com•¸èunemen“te›¤²riten“uti,–Çûa˜ragione,“di˜nessun˜v‘ÿqÐalore.‘6±Com¸èunque˜€è˜sbagliatoŽ¡ritenere–®Çcš¸èhe“si“tratti“di“un“errore,‘Ð pGerc˜h€é“una“compilazione“del“k˜ernel“si“bloGcca“sempre“duran˜te“`Âmake‘?¬zImage¹'Ž¡-–„ €è“logico“cš¸èhe“ci€ò“accada:‘Ѐ`Âmake‘?¬zImage¹'“probabilmen˜te“compila“pi€ù“di“200“le.‘In“genere“si“ricerca“un“bugŽ¡in–U un“insieme“pi€ù“Ápiccolo“¹di“cos€ì.Ž©ؼSe–!ì€è“pšGossibile“duplicare“l'errore,‘Ue“(ancora“meglio)“pro˜durre“un“brevš¸èe“programma“c˜he“lo“dimostra,‘U€è“pGos-Ž¡sibile–Üinš¸èviarlo“come“repGort“di“errori“all'FSF,“o“alla“mailing“list“di“Âlinux-gcc¹.‘K³Si“faccia“riferimen˜to“allaŽ¡došGcumen¸ètazione–U di“gcc“p˜er“i“dettagli“relativi“alle“informazioni“eettiv‘ÿqÐamen¸ète“necessarie.ŽŸ"a~Ä4.3Ž‘¾P ortabilit€àŽŸMª¹€È‘+stato–+detto“c¸èhe,›3zin“questi“giorni,˜se“non“pu€ò“essere“pGortato“a“Lin¸èux,˜allora“€è“qualcosa“c¸èhe“non“v‘ÿqÐale“la“pGenaŽ¡di‘U pGossedere.‘q€:-)Ž¦In–“;generale,‘âÂsono“necessarie“solo“piccole“mošGdic¸èhe“p˜er“ottenere“la“conformit€à“POSIX‘’éal“100%“di“Lin¸èux.Ž¡SarebbšGe–zanc¸èhe“molto“utile“restituire“agli“autori“ogni“mo˜dica“al“co˜dice“in“mo˜do“c¸èhe,›Ãìin“futuro,˜si“pGossaŽ¡ottenere–U un“eseguibile“funzionan¸ète“tramite“il“solo“comando“'Âmake¹'.Ž© ÐÁ4.3.1Ž‘#!\BSD–Õ(inclusi“bsd_ioQÂctl,“demone“e“µ<Ásgtt®>y‘ÿ º.hµ>Á)ŽŸMª¹€È‘´'pGossibile–´@compilare“il“proprio“programma“con“Â-I/usr/include/bsd“¹ed“eseguire“il“link“con“Â-lbsd“¹(ossia,Ž¡aggiungere–GuÂ-I/usr/include/bsd“¹a“ÂCFLAGS›G6¹e“Â-lbsd“¹alla“riga“ÂLDFLAGS˜¹nel“proprio“ÂMakefile¹).‘H~Non“€è“pi€ùŽ¡necessario–áÚaggiungere“Â-D__USE_BSD_SIGNAL‘ᶹse“si“desidera“un“compšGortamen¸èto“dei“segnali“di“tip˜o“BSD,“dalŽ¡momen•¸èto›G±c“he˜questa˜caratteristica˜viene˜otten“uta˜automaticamen“te˜quando˜si˜ha˜Â-I/usr/include/bsd˜¹eŽ¡l'include‘U µ<Âsignal.hµ>¹.Ž¦Á4.3.2Ž‘#!\Segnali–Õ'mancan®>ti'“(ÂSIGBUSÁ,“ÂSIGEMTÁ,“ÂSIGIOTÁ,“ÂSIGTRAPÁ,“ÂSIGSYS“Áecc)ŽŸMª¹Lin¸èux–\È€è“conforme“a“POSIX.“Quelli“elencati“nel“seguito“sono“segnali“non“deniti“in“POSIX›\Æ-“ISO/IEC˜9945-Ž¡1:1990–U (IEEE“Std“1003.1-1990),“paragrafo“B.3.3.1.1:Ž©“F‘'ÿI›Éõsegnali–ÊSIGBUS,“SIGEMT,“SIGIOT,“SIGTRAP‘ÿ*¸,“e“SIGSYS˜sono“stati“omessi“da“POSIX.1Ž¡‘pšGerc¸èh€é–Ãil“loro“comp˜ortamen¸èto“dip˜ende“dall'implemen¸ètazione“e“non“€è“stato“p˜ossibile“classicarloŽ¡‘adeguatamen•¸ète.‘“@Implemen“tazioni– conformi“pGotranno“conš¸ètenere“questi“segnali,‘8…ma“dev˜ono“doGc-Ž¡‘umenš¸ètare–þ…le“circostanze“in“cui“sono“rilasciati“ed“elencare“ogni“restrizione“riguardan˜te“il“loroŽ¡‘rilascio.Ž¦Il– ëmoGdo“pi€ù“economico“e“scaden¸ète“di“gestire“la“cosa“consiste“nel“ridenire“questi“segnali“in“ÂSIGUNUSED¹.“IlŽ¡mošGdo–U Ácorretto“¹consiste“nell'inserire“il“co˜dice“c¸èhe“li“gestisce“in“appropriati“Â#ifdefŽŸop‘Æ#ifdef‘¹NSIGSYSŽ¤ Š=‘/*–¹N...“codice“SIGSYS“non-posix“....“*/Ž¡‘#endifŽŸ ÐÁ4.3.3Ž‘#!\CoQÂdice–ÕK“&“RŽŸMª¹GCC‘åx€è–åun“compilatore“ANSI;“una“grande“quanš¸ètit€à“di“coGdice“esisten˜te“non“€è“ANSI.“Non“c'€è“molto“da“fareŽ¤ ®pGer–ñérisolvš¸èere“questo“problema,‘oltre“all'aggiungere“Â-traditional“¹alle“opzioni“del“compilatore.‘GÚSi“in˜vita“aŽ¡consultare–U l'info“page“di“gcc.ŽŽŽŒ‹ ¼" Û_2 ý ~?Ÿ„€ÕÁGŽÁ4.‘ñ8Il–ÕpQÂorting“e“la“compilazione’/o;¹11ŽŽ ÕÁ ýV¯Si–;´noti“cš¸èhe“Â-traditional“¹ha“altri“eetti“oltre“a“cam˜biare“il“linguaggio“accettato“da“gcc.‘iA˜d“esempio,‘@Êattiv‘ÿqÐaŽ¤ ®Â-fwritable-strings¹,‘×mcš¸èhe–Š+spGosta“le“stringhe“costan˜ti“nello“spazio“dati“(dallo“spazio“di“coGdice,‘×mdo˜v˜e“nonŽ¡pšGossono–U essere“scritte).‘q€Questo“aumen¸èta“l'o˜ccupazione“di“memoria“del“programma.Ž© [ÚÁ4.3.4Ž‘#!\Conitto–Õdei“sim®>bšQÂoli“di“prepro˜cessore“con“prototipi“nel“co˜diceŽŸMª¹Uno–4bdei“problemi“pi€ù“frequenš¸èti“consiste“nel“fatto“c˜he“alcune“funzioni“com˜uni“sono“denite“come“macro“negliŽ¡header–›úle“di“Lin¸èux“e“il“preprošGcessore“si“riuter€à“di“eseguire“il“parsing“di“denizioni“prototip˜o“simili.‘FI‘›èpi€ùŽ¡com¸èuni–U sono“Âatoi()“¹e“Âatol()¹.Ž¦Á4.3.5Ž‘#!\Âsprintf()ŽŸMª¹Soprattutto–1þquando“si“esegue“il“pšGorting“da“SunOS,“€è“necessario“essere“consap˜evš¸èoli“del“fatto“c˜heŽ¡Âsprintf(string,–?¬fmt,“...)‘-œ¹restituisce–‰run“punš¸ètatore“a“stringhe,‘²/men˜tre“Lin˜ux“(seguendo“ANSI)‘‰?restituisceŽ¡il–U nš¸èumero“di“caratteri“c˜he“sono“stati“messi“nella“stringa.Ž¦Á4.3.6Ž‘#!\Âfcntl–ÕÁe“ani.‘ Quali“sono“le“denizioni“di“ÂFD_*Á?ŽŸMª¹Le–÷ódenizioni“si“troš¸èv‘ÿqÐano“in“µ<Âsys/time.hµ>¹.‘YùSe“si“sta“utilizzando“Âfcntl¹,‘ ¨probabilmen˜te“si“v˜orr€à“includereŽ¡anc¸èhe‘U µ<Âunistd.hµ>¹.ŽŸؼIn–õßgenere,‘ìla“pagina“di“man¸èuale“di“una“funzione“elenca“gli“Â#include“¹necessarie“nella“sua“sezione“SYNOPSIS.Ž¦Á4.3.7Ž‘#!\Il–Õtimeout“di“Âselect()Á.‘ Programmi“in“busy-w®>aitingŽŸMª¹Una–…év¸èolta,›’il“parametro“timeout“di“Âselect()“¹era“utilizzato“a“sola“lettura.‘ÛGi€à“allora,˜le“pagine“di“man¸èualeŽ¡a•¸èvv“ertiv‘ÿqÐano:Ž©Ñ‘'ÿselect()–EÐdoš¸èvrebbGe“probabilmen˜te“restituire“il“tempGo“rimanen˜te“dal“timeout“originale,‘üse“es-Ž¡‘isten¸ète,‘m­mošGdicando–5‘il“v‘ÿqÐalore“del“temp˜o.‘ÒQuesto“p˜otr€à“essere“implemenš¸ètato“in“v˜ersioni“futureŽ¡‘del›"¨sistema.‘`­P•¸èertan“to,‘,ÀsarebbGe˜sbagliato˜ritenere˜c“he˜il˜pun“tatore˜al˜timeout˜non˜sar€à˜moGdicatoŽ¡‘dalla–U c¸èhiamata“select().Ž¦Ora–:il“futuro“€è“arriv‘ÿqÐato.‘ÎDi“ritorno“da“una“Âselect()¹,‘ÝÁl'argomen¸èto“di“timeout“sar€à“impšGostato“al“temp˜oŽ¡rimanen•¸ète›ö|c“he˜si˜sarebbGe˜atteso˜se˜i˜dati˜non˜fossero˜arriv–ÿqÐati.‘U•Se˜non˜€è˜arriv“ato˜alcun˜dato,‘Óil˜v“alore˜sar€àŽ¡zero,–U e“le“cš¸èhiamate“future“utilizzando“la“stessa“struttura“timeout“eseguiranno“immediatamen˜te“il“return.ŽŸؼP¸èer–Y[rimediare,›‹¶in“caso“di“errore,˜si“metta“il“v‘ÿqÐalore“di“timeout“nella“struttura“ogni“vš¸èolta“c˜he“si“c˜hiama“Âselect()¹.Ž¡Si–U mošGdic¸èhi“il“co˜dice“come:Ž©Jn‰ffÕÁGŸ€ÍÂstruct–?¬timeval“timeout;Ž¡timeout.tv_sec–?¬=“1;“timeout.tv_usec“=“0;Ž¡while‘?¬(some_condition)Ž¡‘)ý`select(n,readfds,writefds,exceptfds,&timeout);ŽŸ Ù;‰ffÕÁGŸ°Ñ¹inŽ¦‰ffÕÁGŸ€ÍÂstruct–?¬timeval“timeout;Ž¡while–?¬(some_condition)“{Ž¡‘)ý`timeout.tv_sec–?¬=“1;“timeout.tv_usec“=“0;Ž¡‘)ý`select(n,readfds,writefds,exceptfds,&timeout);Ž¡}ŽŽŽŒ‹ Ë Û_2 ý ~?Ÿ„€ÕÁGŽÁ4.‘ñ8Il–ÕpQÂorting“e“la“compilazione’/o;¹12ŽŽ ÕÁ ýV¯‰ffÕÁGŸ ÈAlcune–,ôvš¸èersioni“di“Mosaic“evidenzia˜v‘ÿqÐano“questo“problema.‘dLa“v˜elošGcit€à“dell'animazione“del“glob˜o“rotan¸ète“eraŽ¤ ®in•¸èv“ersamen“te–U correlata“alla“v¸èeloGcit€à“con“cui“i“dati“giungev‘ÿqÐano“dalla“rete!Ž© ÖÁ4.3.8Ž‘#!\Chiamate–Õdi“sistema“in®>terrotteŽŸMªSin®>tomo‘ ÿ`¹Quando–†Áun“programma“viene“inš¸èterrotto“utilizzando“ÂCtrl-Z‘†r¹e“pGoi“viene“ria˜vviato“-“o“in“altreŽ¡situazioni–HŒcš¸èhe“generano“dei“segnali:‘XWin˜terruzione“con“ÂCtrl-C¹,“terminazione“di“un“proGcesso“glio“ecc.‘KÃ-“siŽ¡ottengono–U messaggi“del“tipGo“inš¸èterrupted“system“call“o“write:‘q€unkno˜wn“error.Ž¦ÁProblema‘ ÿ`¹I–ñsistemi› POSIX“con•¸ètrollano˜la˜presenza˜di˜segnali˜pi€ù˜frequen“temen“te˜rispGetto˜a˜sistemi˜UNIXŽ¡pi€ù›U v•¸èecc“hi.‘q€Lin“ux˜pu€ò˜eseguire˜dei˜gestori˜di˜segnali:Ž©ؼ‘¸ŽŽŽ‘¹in–U moGdo“asincrono“(tramite“un“timer)Ž¤®‘¸ŽŽŽ‘¹al–U ritorno“da“ogni“c¸èhiamata“di“sistemaŽ¡‘¸ŽŽŽ‘¹duranš¸ète–£l'esecuzione“delle“seguen˜ti“c˜hiamate“di“sistema:‘þ†Âselect()¹,–MDÂpause()¹,“Âconnect()¹,“Âaccept()¹,Ž¤ ®‘Âread()–Ÿð¹su“terminali,›²¤su“soGc•¸èk“et,˜su–ŸðpipGe“o“su“le“in“Â/proc¹,˜Âwrite()“¹su“terminali,˜su“soGc•¸èk“et,˜su–ŸðpipGe“oŽ¡‘sulla–"line“prinš¸èter;‘X¢Âopen()“¹su“FIF˜O,“su“PTY‘õo“su“linee“seriali,‘-bÂioctl()“¹su“terminali;‘X¢Âfcntl()“¹con“ilŽ¡‘comando–U ÂF_SETLKW¹;“Âwait4()¹,“Âsyslog()¹,“ogni“opGerazione“TCP“o“NFS.Ž¦P¸èer–œnaltri“sistemi“opšGerativi“p˜otrebb˜e“essere“necessario“includere“in“questa“lista“le“c¸èhiamate“di“sistema“Âcreat()¹,Ž¡Âclose()¹,–‰QÂgetmsg()¹,“Âputmsg()¹,“Âmsgrcv()¹,“Âmsgsnd()¹,“Ârecv()¹,“Âsend()¹,“Âwait()¹,“Âwaitpid()¹,“Âwait3()¹,Ž¡Âtcdrain()¹,–U Âsigpause()¹,“Âsemop()¹.Ž©ؼSe–ãun“segnale“(pGer“il“quale“il“programma“ha“installato“un“gestore)“aš¸èvviene“duran˜te“una“c˜hiamata“di“sistema,Ž¡viene–cš¸èhiamato“il“gestore.‘~Quando“il“gestore“restituisce“il“con˜trollo“(alla“c˜hiamata“di“sistema),‘/¸essa“rilev‘ÿqÐaŽ¡cš¸èhe–Ñì€è“stata“in˜terrotta“e“restituisce“immediatamen˜te“-1“e“Âerrno–?¬=“EINTR¹.–ÑìIl“programma“non“si“aspGetta“c˜heŽ¡questo–U accada,“pšGertan¸èto“si“blo˜cca.Ž¦€È–U pšGossibile“scegliere“tra“due“alternativ¸èe,“p˜er“rimediare.ŽŸؼ‘¸ŽŽŽ‘¹Pš¸èer–ž8ogni“gestore“di“segnali“c˜he“viene“installato,‘ÂÍaggiungere“ÂSA_RESTART‘ž ¹ai“ag“Âsigaction¹.‘4ˆP˜er“esempio,Ž¡‘moGdicareŽ¤ff‰ffÕÁG©ñX‘Âsignal–?¬(sig_nr,“my_signal_handler);ŽŸ Ÿ&‰ffÕÁGŸ¢!‘¹inŽ¡‰ffÕÁG¦‘Âsignal–?¬(sig_nr,“my_signal_handler);Ž¤ ®‘{–?¬struct“sigaction“sa;Ž¡‘#Zsigaction–?¬(sig_nr,“(struct“sigaction“*)0,“&sa);Ž¡‘#ifdef‘?¬SA_RESTARTŽ¡‘#Zsa.sa_flags–?¬|=“SA_RESTART;Ž¡‘#endifŽ¡‘#ifdef‘?¬SA_INTERRUPTŽ¡‘#Zsa.sa_flags–?¬&=“~“SA_INTERRUPT;Ž¡‘#endifŽ¡‘#Zsigaction–?¬(sig_nr,“&sa,“(struct“sigaction“*)0);Ž¡‘}ŽŽŽŒ‹ ×M Û_2 ý ~?Ÿ„€ÕÁGŽÁ4.‘ñ8Il–ÕpQÂorting“e“la“compilazione’/o;¹13ŽŽ ÕÁ ýV¯‰ffÕÁGŸøú‘Si–"noti“cš¸èhe“men˜tre“questo“viene“applicato“alla“maggior“parte“delle“c˜hiamate“di“sistema,‘Áî€è“necessario“con-Ž¤ ®‘trollare–>0ÂEINTR‘>*¹pGersonalmen¸ète“riguardo“a“Âread()¹,–BÆÂwrite()¹,“Âioctl()¹,“Âselect()¹,“Âpause()–>0¹e“Âconnect()Ž¡‘¹.‘q€Si–U v¸èeda“sotto.ŽŸú‘¸ŽŽŽ‘¹Conš¸ètrollare–U ÂEINTR“¹esplicitamen˜te.ŽŸR}Seguono–U due“esempi“pGer“Âread()“¹e“Âioctl()¹.ŽŸؼUna–U parte“di“coGdice“originale“utilizzan¸ète“Âread()ŽŸ»õ‰ffÕÁG©Àyint‘?¬result;Ž¡while–?¬(len“>“0)“{Ž¡‘)ý`result–?¬=“read(fd,buffer,len);Ž¡‘)ý`if–?¬(result“<“0)“break;Ž¡‘)ý`buffer–?¬+=“result;“len“-=“result;Ž¡}ŽŸ µo‰ffÕÁGŸq¯¹div•¸èen“taŽŸÊM‰ffÕÁG¦Âint‘?¬result;Ž¡while–?¬(len“>“0)“{Ž¡‘)ý`result–?¬=“read(fd,buffer,len);Ž¡‘)ý`if–?¬(result“<“0)“{“if“(errno“!=“EINTR)“break;“}Ž¡‘)ý`else–?¬{“buffer“+=“result;“len“-=“result;“}Ž¡}ŽŸ µo‰ffÕÁGŸç¹e–U una“parte“di“coGdice“utilizzan¸ète“Âioctl()ŽŸ»õ‰ffÕÁG¦‘þ°int‘?¬result;Ž¡‘þ°result–?¬=“ioctl(fd,cmd,addr);ŽŸ CŸ‰ffÕÁGŸq¯¹div•¸èen“taŽŸÊM‰ffÕÁG¦‘þ°Âint‘?¬result;Ž¡‘þ°do–?¬{“result“=“ioctl(fd,cmd,addr);“}Ž¡‘þ°while–?¬((result“==“-1)“&&“(errno“==“EINTR));ŽŸ CŸ‰ffÕÁGŸq¯¹Si–¯ênoti“cš¸èhe“in“alcune“v˜ersioni“di“Unix“BSD‘¯Òil“compGortamen˜to“predenito“consiste“nel“ria˜vviare“le“c˜hiamateŽ¡di–mBsistema.‘¹åPš¸èer“ottenere“l'in˜terruzione“delle“c˜hiamate“di“sistema“€è“necessario“utilizzare“i“ag“ÂSV_INTERRUPTŽ¡¹o‘U ÂSA_INTERRUPT¹.ŽŸ ’äÁ4.3.9Ž‘#!\Stringhe–Õscrivibili“(il“programma“genera“'segmen®>tation“fault'“in“moQÂdo“casuale)ŽŸMª¹GCC‘œha–œÕuna“visione“ottimistica“dei“suoi“utenš¸èti,‘îÂconsiderando“le“costan˜ti“stringa“esattamen˜te“quello“c˜heŽ¡sono–òà-“delle“costan•¸èti.‘JÁP“ertan“to,›Ple–òàmemorizza“nell'area“del“coGdice,˜do•¸èv“e–òàpGossono“essere“inserite“ed“estratteŽ¡dall'immagine–hÐdi“disco“del“programma“(in•¸èv“ece–hÐdi“oGccupare“uno“swš¸èapspace).‘¬‘Ne“consegue“c˜he“ogni“ten˜tativ˜oŽ¡di–U riscrivš¸èerle“causer€à“'segmen˜tation“fault'.Ž©ؼQuesto–Ý/pu€ò“causare“dei“problemi“a“v•¸èecc“hi–Ý/programmi“cš¸èhe,‘õ,pGer“esempio“eseguono“una“c˜hiamata“Âmktemp()“¹conŽ¡una–U stringa“costanš¸ète“come“argomen˜to.‘q€Âmktemp()“¹ten˜ta“di“riscriv˜ere“il“suo“argomen˜to.Ž¦P¸èer‘U correggere,ŽŽŽŒ‹ã Û_2 ý ~?Ÿ„€ÕÁGŽÁ5.‘ñ8Debugging–Õe“Proling’Kÿ9¹14ŽŽ ÕÁ ýV¯‘¸ŽŽŽ‘¹compilare–¥con“l'opzione“Â-fwritable-strings¹,‘ù pšGer“fare“in“mo˜do“c¸èhe“gcc“p˜osizioni“le“costan¸èti“nelloŽ¤ ®‘spazio–U dati,“oppureŽŸ‚”‘¸ŽŽŽ‘¹riscrivš¸èere–ôMle“parti“c˜he“causano“dei“problemi“pšGer“allo˜care“una“stringa“non“costan¸ète“ed“eseguire“la“ÂstrcpyŽ¡‘¹dei–U dati“in“essa“prima“della“c¸èhiamata.ŽŸ U*Á4.3.10Ž‘(áP•®>erc“h€é–Õla“c®>hiamata“Âexecl()“Áfallisce?ŽŸMª¹Probabilmenš¸ète–ñ§accade“pGerc˜h€é“viene“eseguita“in“moGdo“errato.‘GIl“primo“argomen˜to“pGer“Âexecl“¹€è“il“nome“delŽ¡programma–²da“eseguire.‘;&Il“secondo“e“i“successivi“div•¸èen“tano›²l'arra“y˜Âargv˜¹del˜programma˜c“he˜si˜sta˜c“hiamando.Ž¡Ricordare–ácš¸èhe:‘ÿÂargv[0]“¹viene“impGostato“anc˜he“pGer“un“programma“eseguito“senza“argomen˜ti.‘ÅÄP˜ertan˜to“siŽ¡do•¸èvrebbGe‘U scriv“ereŽ¤:ç‰ffÕÁG©/A‘þ°Âexecl("/bin/ls","ls",NULL);ŽŸÝ‰ffÕÁGŸâI¹e–U non“soloŽ¡‰ffÕÁG¦‘þ°Âexecl("/bin/ls",‘?¬NULL);ŽŸÝ‰ffÕÁGŸâI¹L'esecuzione–Bàdel“programma“senza“nessun“argomenš¸èto“€è“in˜terpretata“come“un“in˜vito“a“stampare“le“sueŽ¤ ®dipšGendenze–U a“librerie“dinamic¸èhe,“almeno“utilizzando“Âa.out¹.‘q€ELF“si“comp˜orta“div•¸èersamen“te.Ž©ؼ(Se–ƒÂsi“desidera“questa“informazione“di“libreria,‘jesistono“inš¸èterfacce“pi€ù“semplici;‘›si“v˜eda“il“paragrafo“relativ˜oŽ¡al–U caricamenš¸èto“dinamico,“o“la“pagina“di“man˜uale“pGer“Âldd¹).ŽŸ(?±À5Ž‘ÁDebugging–G\e“ProlingŽŸèÄ5.1Ž‘¾Man• utenzione›¸prev“en“tiv‘ÿ@ a˜(lin“t)ŽŸMª¹Non–Æóesiste“un“Âlint“¹ampiamenš¸ète“utilizzato“pGer“Lin˜ux,‘#gdal“momen˜to“c˜he“la“maggior“parte“della“gen˜te“siŽ¡accon•¸èten“ta–“|degli“a•¸èvv“ertimen“ti›“|c“he˜gcc˜pu€ò˜generare.‘,•Probabilmen“te,‘£quello˜pi€ù˜utile˜€è˜il˜Â-Wall˜¹opzione˜c“heŽ¡signica–~ö'W‘ÿ*¸arnings,›©Ëall'“ma“probabilmen¸ète“ha“un“maggior“v‘ÿqÐalore“mnemonico,˜se“pGensato“come“qualcosa“con¸ètroŽ¡cui–U si“sbatte“la“testa“(NdT.“wš¸èall“in“inglese“signica“m˜uro).Ž¦Esiste–/Iun“lin¸èt“di“dominio“pubblico“dispšGonibile“su“¼ftp://lar–ÿ}/ch.lcs.mit.e“du/pub/L“ar“ch/lclint–/I¹.‘ÿúPutropp˜o“nonŽ¡sono–U in“grado“di“giudicare“la“sua“v‘ÿqÐalidit€à.ŽŸ"œØÄ5.2Ž‘¾DebuggingŽ¤MªÁ5.2.1Ž‘#!\Come–Õsi“ottengono“le“informazioni“di“debug“in“un“programma?Ž¡¹€È‘é©necessario–ëcompilare“ed“eseguire“il“link“di“tutte“le“sue“parti“con“l'opzione“Â-g¹,‘ P˜e“senzaŽ¤ ®Â-fomit-frame-pointer¹.‘q€Non–U €è“necessario“ricompilarlo“in•¸èteramen“te,–U solo“le“parti“di“cui“si“esegue“il“debug.Ž¦Nelle–'Ácongurazioni“a.out“le“librerie“condivise“sono“compilate“con“Â-fomit-frame-pointer¹,‘0Ôcon“la“quale“gdbŽ¡non–U funzioner€à.‘q€Questo“pGerc¸èh€é“l'opzione“Â-g“¹implica“un“link“statico.Ž¦Se–(fil“linkš¸èer“v‘ÿqÐa“in“errore“fornendo“un“messaggio“c˜he“indica“l'impGossibilit€à“di“tro˜v‘ÿqÐare“Âlibg.a¹,‘1Xsignica“c˜he“nonŽ¡si–L¢pšGossiede“Â/usr/lib/libg.a¹,‘NUc¸èhe“consiste“nella“sp˜eciale“libreria“C‘L abilitata“al“debugging.‘n«T‘ÿ*¸ale“libreria“pu€òŽ¡essere–—Tfornita“nel“paccš¸èhetto“binario“libGc,‘§áoppure“(in“v˜ersioni“di“libreria“C‘—Cpi€ù“recen˜ti)“pu€ò“essere“necessarioŽ¡ottenere–Cil“cošGdice“sorgen¸ète“lib˜c“ed“eseguire“p˜ersonalmenš¸ète“la“compilazione.‘;3T‘ÿ*¸utta˜via,‘~€€è“pGossibile“ottenereŽ¡sucienš¸èti–iinformazioni“pGer“la“maggior“parte“degli“scopi“semplicemen˜te“sostituendola“con“un“collegamen˜toŽ¡sim¸èbGolico–U con“Â/usr/lib/libc.a¹.ŽŽŽŒ‹죠Û_2 ý ~?Ÿ„€ÕÁGŽÁ5.‘ñ8Debugging–Õe“Proling’Kÿ9¹15ŽŽ ÕÁ ýV¯ÁCome‘€Teliminarle?‘ÿ?¹Molto› jsoft•¸èw“are˜GNU‘ X€è˜impGostato˜anc“h€é˜la˜compilazione˜e˜il˜link˜siano˜eseguite˜conŽ¤ ®l'opzione–òGÂ-g¹,‘‘cš¸èhe“determina“la“generazione“di“eseguibili“molto“v˜oluminosi“(e“spGesso“statici).‘HõQuesta“non“€èŽ¡una–U buona“idea.Ž©ؼSe–\Ãil“programma“pšGossiede“uno“script“di“congurazione“`Âautoconf¹',‘^¬€è“p˜ossibile“disabilitare“le“informazioni“diŽ¡debugging–£#conš¸ètrollando“il“ÂMakefile¹.‘[ˆNaturalmen˜te,‘¶£se“si“sta“utilizzando“ELF,“il“link“del“programma“vieneŽ¡eseguito–in“mošGdo“dinamico“indip˜enden•¸ètemen“te–dall'imp˜ostazione“Â-g¹,‘FLp˜ertanš¸èto“si“pu€ò“semplicemen˜te“usareŽ¡Âstrip¹.ŽŸ ÖÁ5.2.2Ž‘#!\Soft•®>w“are‘ÕdispQÂonibileŽŸMª¹Molte–¶ApGersone“utilizzano“gdb,‘ ‰cš¸èhe“pu€ò“essere“otten˜uto“in“forma“sorgen˜te“dai“siti“di“arc˜hiv-Ž¡io› ÿ GNU‘ üμftp://pr–ÿ}/ep.ai.mit.e“du/pub/gnu˜¹,‘)„oppure˜in˜formato˜binario˜da˜¼tsx-11‘ Œ&(ftp://tsx-Ž¡11.mit.e–ÿ}/du/pub/linux/p“ackages/GCC)›]¹o–Žda“sunsite.‘/ûÂxxgdb“¹€è“un“debugger“X˜basato“su“gdb“(ossia,‘·ß€è“necessarioŽ¡cš¸èhe–U sia“installato“gdb).‘q€€È“pGossibile“tro˜v‘ÿqÐare“i“sorgen˜ti“presso“¼ftp://ftp.x.or–ÿ}/g/c“ontrib/xxgdb-1.08.tar.gz‘U ¹.Ž¦Ric•¸èk› +Sladk“ey˜ha˜eseguito˜il˜pGorting˜del˜debugger˜UPS.˜Pu€ò˜essere˜eseguito˜anc“he˜sotto˜X,˜ma˜aŽ¡dierenza–¢=di“Âxxgdb¹,‘u„non“€è“un“semplice“fronš¸èt“end“X‘¡cpGer“un“debugger“basato“su“testo.‘XÖP˜ossiedeŽ¡div•¸èerse›s¿caratteristic“he˜molto˜in“teressan“ti,‘{ge˜se˜si˜ha˜la˜necessit€à˜di˜eseguire˜div“ersi˜debug,‘{g€è˜ilŽ¡caso–·Ydi“proš¸èv‘ÿqÐarlo.‘˜+La“v˜ersione“precompilata“pGer“Lin˜ux“e“i“patc˜h“pGer“i“sorgen˜ti“UPS‘¶8pGossonoŽ¡essere–!troš¸èv‘ÿqÐati“in“¼ftp://sunsite.unc.e‘ÿ}/du/pub/Linux/devel/debuggers/“¹,‘ 1!men˜tre“i“sorgen˜ti“originali“inŽ¡¼ftp://ftp.x.or–ÿ}/g/c“ontrib/ups-2.45.2.tar.Z‘U ¹.Ž¦Un–7Kaltro“strumenš¸èto“utile“pGer“il“debug“€è“'Âstrace¹',‘=Bc˜he“visualizza“le“c˜hiamate“di“sistema“fatte“da“un“proGcesso.Ž¡Questo–`£strumenš¸èto“pGossiede“anc˜he“molti“altri“utilizzi,‘cƒinclusa“la“pšGossibilit€à“di“sap˜ere“i“nomi“di“le“compilati,Ž¡di–’0cui“non“si“pšGossiede“il“sorgen¸ète;‘°¸di“esasp˜erare“i“race“condition“in“programmi“c¸èhe“si“sosp˜ettano“con¸ètenerle,Ž¡e–K@in“generale“di“imparare“come“funzionano“le“cose.‘n5La“vš¸èersione“pi€ù“recen˜te“di“Âstrace“¹(attualmen˜te“la“3.0.8)Ž¡pu€ò–U essere“tro¸èv‘ÿqÐata“in“¼ftp://ftp.std.c‘ÿ}/om/pub/jrs/“¹.ŽŸ ÖÁ5.2.3Ž‘#!\Programmi–Õbac®>kground“(demone)ŽŸMª¹I‘NÛprogrammi–NÝdemone“tipicamenš¸ète“eseguono“presto“la“Âfork()¹,‘Pe“terminano“il“programma“c˜hiaman˜te.‘ojQuestoŽ¡rende–U la“sessione“di“debug“molto“brev¸èe.Ž¦Il–8ïmošGdo“pi€ù“semplice“p˜er“aggirare“questo“ostacolo“consiste“nell'imp˜ostare“un“breakp˜oin¸èt“p˜er“Âfork¹,‘>’e“quandoŽ¡il–U programma“si“bloGcca,“forzare“la“restituzione“di“0.ŽŸ´å‘Æ(gdb)‘¹NlistŽ¤ Š=‘1‘FÛ’#include‘¹NŽ¡‘2Ž¡‘3‘FÛ’main()Ž¡‘4‘FÛ’{Ž¡‘5‘FÛ’if(fork()==0)‘¹Nprintf("child\n");Ž¡‘6‘FÛ’else‘¹Nprintf("parent\n");Ž¡‘7‘FÛ’}Ž¡‘(gdb)–¹Nbreak“forkŽ¡‘Breakpoint–¹N1“at“0x80003b8Ž¡‘(gdb)‘¹NrunŽ¡‘Starting–¹Nprogram:“/home/dan/src/hello/./forkŽ¡‘Breakpoint–¹N1“at“0x400177c4Ž¡¡‘Breakpoint–¹N1,“0x400177c4“in“fork“()Ž¡‘(gdb)–¹Nreturn“0Ž¡‘Make–¹Nselected“stack“frame“return“now?“(y“or“n)“yŽŽŽŒ‹úu Û_2 ý ~?Ÿ„€ÕÁGŽÁ6.‘ñ8Linking’“ú¹¹16ŽŽ ÕÁ ýV¯‘Æ#0‘ rœ0x80004a8–¹Nin“main“()Ž¤ Š=‘at‘¹Nfork.c:5Ž¡‘5‘FÛ’if(fork()==0)‘¹Nprintf("child\n");Ž¡‘(gdb)‘¹NnextŽ¡‘Step–¹Nsingolo“fino“all'uscita“dalla“funzione“fork,Ž¡‘che–¹Nnon“contiene“informazioni“sul“numero“di“riga.Ž¡‘childŽ¡‘7‘FÛ’}ŽŸ ÖÁ5.2.4Ž‘#!\Core‘ÕleŽŸMª¹Quando–"ULinš¸èux“viene“a˜vviato,‘,~solitamen˜te“€è“congurato“pšGer“non“pro˜durre“core“le.‘`’Se“si“desidera,‘,~€è“p˜ossibileŽ¤ ®utilizzare– ^il“comando“inš¸èterno“dell'in˜terprete“comandi“pšGer“riabilitarli:‘Ùûp˜er“¼shel‘‚Ðl‘Õ¹compatibili“C‘ /(come“Âtcsh¹)Ž¡corrispGonde–U al“comandoŽ¤´å‘Æ%–¹Nlimit“core“unlimitedŽ©ؼ¹menš¸ètre–U pGer“in˜terpreti“comandi“di“tipGo“Bourne“(Âsh¹,“Âbash¹,“Âzsh¹,“Âpdksh¹)“utilizzareŽ¡‘Æ$–¹Nulimit“-c“unlimitedŽ¦¹Se–¼]si“desidera“una“maggiore“essibilit€à“nell'assegnazione“dei“nomi“ai“core“le“(nel“caso,›ÚêpGer“esempio,˜di“analisiŽ¤ ®pGost-mortem–ÝÖcon“un“debugger“cš¸èhe“con˜tiene“errori)“€è“pšGossibile“eseguire“una“piccola“mo˜dica“al“proprio“k¸èernel.Ž¡Cercare–U in“Âfs/binfmt_aout.c“¹e“Âfs/binfmt_elf.c“¹il“cošGdice“tip˜o:ŽŸX‰ffÕÁGŸ‘ XÂmemcpy(corefile,"core.",5);Ž¡#if‘?¬0Ž¡‘ Xmemcpy(corefile+5,current->comm,sizeof(current->comm));Ž¡#elseŽ¡‘ Xcorefile[4]–?¬=“'\0';Ž¡#endifŽŸ ff‰ffÕÁGŸ ȹe–U moGdicare“gli“Â0“¹in“Â1¹.ŽŸ#ÃÄ5.3Ž‘¾ProlingŽŸMª¹Il–œ×proling“rappresen¸èta“un“mošGdo“p˜er“esaminare“le“parti“di“un“programma“ricš¸èhiamate“pi€ù“frequen˜temen˜te“oŽ¡eseguite–øGpi€ù“a“lungo.‘R€È‘ø/buona“norma“ottimizzare“il“coGdice“e“vš¸èedere“do˜v˜e“viene“pšGerso“del“temp˜o.‘R€È‘ø/necessarioŽ¡compilare–9Ttutti“i“le“oggetto“sui“quali“si“desiderano“informazioni“sul“tempGo“di“esecuzione“con“l'opzione“Â-p¹,‘>ãeŽ¡pGer–©Îinš¸èterpretare“il“le“di“output“sar€à“necessario“anc˜he“Âgprof“¹(dal“pacc˜hetto“bin˜utils).‘oŠSi“v˜eda“la“pagina“diŽ¡man¸èuale–U Âgprof“¹pGer“ulteriori“dettagli.ŽŸ(ÀœÀ6Ž‘ÁLinkingŽŸ¿:¹Questo–Å¥paragrafo“€è“piuttosto“complicato“a“causa“dei“due“formati“binari“incompatibili,‘âWla“distinzione“tra“libre-Ž¡ria–û÷statica“e“condivisa,‘ Ìe“del“soš¸èvraccarico“del“v˜erbGo“'link'“c˜he“signica“sia“'cosa“accade“dopGo“la“compilazione',Ž¡sia–ß'cosa“accade“quando“viene“ric¸èhiamato“un“programma“compilato'“(e,›Mdi“fatto,˜il“soš¸èvraccarico“del“v˜erbGoŽ¡'load'–U in“un“senso“simile“ma“oppGosto).ŽŽŽŒ‹  Û_2 ý ~?Ÿ„€ÕÁGŽÁ6.‘ñ8Linking’“ú¹¹17ŽŽ ÕÁ ýV¯Pš¸èer–\4ridurre“in“qualc˜he“moGdo“la“confusione,‘øsi“user€à“il“termine“`caricamen˜to“dinamico'“(dynamic“loading)Ž¤ ®pGer–d¯quello“cš¸èhe“accade“duran˜te“l'esecuzione,‘¨“argomen˜to“descritto“nel“prossimo“paragrafo.‘ ,P˜otrebbGe“anc˜heŽ¡accadere–çudi“troš¸èv‘ÿqÐare“il“termine“'collegamen˜to“dinamico'“(dynamic“linking)“con“lo“stesso“signicato,‘ ma“nonŽ¡in–Rjquesto“doGcumenš¸èto.‘p™Questo“paragrafo,–Rõquindi,“tratta–Rjesclusiv‘ÿqÐamen˜te“il“tipGo“di“link“c˜he“a˜vviene“alla“ne“diŽ¡una‘U compilazione.ŽŸ#ÃÄ6.1Ž‘¾Librerie–¸condivise“e“static heŽŸMª¹L'ultima–%`fase“della“compilazione“di“un“programma“consiste“nel“'collegamen¸èto'“(link),‘.ìossia“nell'unire“tutte“leŽ¡parti–‡Ûe“vš¸èedere“se“manca“qualcosa.‘ ²Ovviamen˜te“esistono“alcune“cose“c˜he“molti“programmi“hanno“in“com˜uneŽ¡-–&ad“esempio,››(aprire“le,˜ed“il“coGdice“in“grado“di“fare“queste“cose“sono“fornite“sotto“forma“di“librerie.‘“NellaŽ¡maggior–U parte“dei“sistemi“Linš¸èux“si“tro˜v‘ÿqÐano“in“Â/lib“¹e“Â/usr/lib/¹.Ž©ؼQuando–‡€si“utilizza“una“libreria“statica,‘”il“linkš¸èer“tro˜v‘ÿqÐa“le“parti“necessarie“ai“moGduli“di“programma“e“le“copiaŽ¡sicamenš¸ète–”¾nel“le“di“output“eseguibile“c˜he“viene“generato.‘0[Al“con˜trario,‘¤¦questo“non“a˜vviene“pGer“le“librerieŽ¡condivise–Å-“in“questo“caso“nell'output“viene“inserita“una“nota“del“tipGo“'quando“viene“eseguito“questo“pro-Ž¡gramma,›o€è–iènecessario“caricare“questa“libreria'.‘¯ÙOvviamen¸ète,˜le“librerie“condivise“tendono“a“creare“eseguibiliŽ¡di–isdimensioni“minori;‘sœinoltre“utilizzano“una“quan¸ètit€à“inferiore“di“memoria“e“viene“utilizzato“meno“spazio“suŽ¡disco.‘vIl–RcompGortamenš¸èto“predenito“di“Lin˜ux“consiste“nell'eseguire“il“collegamen˜to“di“librerie“condivise“seŽ¡esistono,‘&altrimen•¸èti›ígv“engono˜utilizzate˜quelle˜static“he.‘NíSe˜si˜ottengono˜dei˜binari˜statici˜quando,‘&al˜con“trario,Ž¡si–uvš¸èogliono“quelli“condivisi,‘Ê con˜trollare“c˜he“i“le“di“libreria“condivisa“(Â*.sa“¹pšGer“a.out,‘Ê Â*.so“¹p˜er“ELF)‘(siŽ¡tro•¸èvino›U do“v“e˜do“vrebbGero˜essere˜e˜siano˜leggibili.Ž¦Su–NZLinš¸èux,‘Œ¨le“librerie“static˜he“hanno“nomi“come“Âlibname.a¹,‘Œ¨men˜tre“le“librerie“condivise“sono“denominateŽ¡Âlibname.so.x.y.z›G¹do•¸èv“e˜Âx.y.z˜¹rappresen“ta˜il˜n“umero˜di˜v“ersione.‘lÌLe˜librerie˜condivise,–I×inoltre,“con¸ètengonoŽ¡spGesso–¨idei“collegamenš¸èti“c˜he“pun˜tano“ad“esse,‘Êôc˜he“risultano“essere“molto“impGortan˜ti,‘Êôe“(in“congurazioni“a.out)Ž¡con¸ètengono–šLdei“le“Â.sa“¹assošGciati.‘3:Le“librerie“standard“sono“disp˜onibili“sia“in“formato“condiviso,‘¿ªsia“in“formatoŽ¡statico.Ž¦€È‘Lp•Gossibile›ysap“ere˜quali˜librerie˜condivise˜sono˜ric¸èhieste˜da˜un˜programma˜utilizzando˜Âldd˜¹(List˜DynamicŽ¡DepGendencies)Ž©´å‘Æ$–¹Nldd“/usr/bin/lynxŽ¤ Š=‘>Êrlibncurses.so.1–¹N=>“/usr/lib/libncurses.so.1.9.6Ž¡‘>Êrlibc.so.5–¹N=>“/lib/libc.so.5.2.18ŽŸؼ¹Questo–AResempio“mostra“cš¸èhe“il“bro˜wser“WWW‘A'lynx'“dipGende“dalla“presenza“di“Âlibc.so.5“¹(la“libreria“C)Ž¤ ®e–cÂlibncurses.so.1“¹(utilizzata“pšGer“il“con¸ètrollo“del“terminale).‘|HSe“un“programma“non“ha“dip˜endenze,‘.óÂlddŽ¡¹rispGonder€à–U 'statically“linkš¸èed'“o“'statically“link˜ed“(ELF)'.ŽŸ#ÃÄ6.2Ž‘¾Inš terrogazione–¸delle“librerie“('In“quale“libreria“si“tro˜v‘ÿ@ a“sin()?')ŽŸMªÂnm–· Ánome_libreria“¹doš¸èvrebbGe“listare“tutti“i“sim˜bšGoli“p˜er“i“quali“esistono“dei“riferimen¸èti“in“Ánome_libreria¹.Ž¡Il–ïícomando“funziona“sia“pGer“librerie“staticš¸èhe“c˜he“dinamic˜he.‘ AçSi“suppGonga“di“v˜oler“sapGer“do˜v'€è“denitaŽ¡Âtcgetattr()¹:‘q€si›U p•Gotrebb“e˜utilizzareŽ¦‘Æ$–¹Nnm“libncurses.so.1“|grep“tcgetŽŸ Š=‘CƒÀU‘¹NtcgetattrŽŸؼ¹`ÂU¹'‘¶signica–ä'undened'“-“mostra“c¸èhe“la“libreria“Âncurses“¹la“utilizza“ma“non“la“denisce.‘†ÌIn“alternativ‘ÿqÐa,‘3UsiŽ¡p•Gotrebb“e‘U usareŽŽŽŒ‹Ê Û_2 ý ~?Ÿ„€ÕÁGŽÁ6.‘ñ8Linking’“ú¹¹18ŽŽ ÕÁ ýV¯‘Æ$–¹Nnm“libc.so.5“|“grep“tcgetŽ¤ Š=‘00010fe8–¹NT“__tcgetattrŽ¡‘00010fe8–¹NW“tcgetattrŽ¡‘00068718–¹NT“tcgetpgrpŽŸؼ¹`ÂW¹'‘signica–?'wš¸èeak',‘Dossia“c˜he“il“sim˜bšGolo“€è“denito,‘Dma“in“mo˜do“tale“da“p˜oter“essere“sostituito“da“un'altraŽ¤ ®denizione–üÇin“una“libreria“div¸èersa.‘huUna“denizione“'normale'“(come“quella“pGer“Âtcgetpgrp¹)“€è“indicata“conŽ¡una‘U 'ÂT¹'.Ž©ؼComš¸èunque–]ðla“rispGosta“brev˜e“alla“domanda“del“titolo,‘ $consiste“in“Âlibm.(so¸jÂa)¹.‘‹ðT‘ÿ*¸utte“le“funzioni“deniteŽ¡in–Â^µ<Âmath.hµ>“¹sono“tenš¸èute“nella“libreria“Âmath¹;‘øýne“consegue“c˜he“sar€à“necessario“eseguire“il“collegamen˜to“conŽ¡l'opzione–U Â-lm“¹quando“si“utilizza“una“di“esse.ŽŸ#ÃÄ6.3Ž‘¾Ricerca–¸dei“leŽŸMªÂld:‘ XOutput–?¬file“requires“shared“library“`libfoo.so.1`Ž¡¹(Ovvš¸èero:–q€ld:“Il–U le“di“output“ric˜hiede“la“libreria“condivisa“'libfoGo.so.1')Ž¦La–°æstrategia“di“ricerca“di“un“le“pGer“ld“e“simili“v‘ÿqÐaria“a“seconda“della“vš¸èersione,‘Ç×ma“l'unico“pun˜to“c˜he“si“pu€òŽ¡ritenere–ð®predenito“€è“Â/usr/lib¹.‘D)Se“si“vuole“cš¸èhe“le“librerie“v˜engano“cercate“in“altre“loGcazioni,‘‘€è“necessarioŽ¡spGecicare–U le“loro“directory“tramite“l'opzione“Â-L“¹in“gcc“o“ld.Ž¦Se–Ùönon“do•¸èv“esse›Ùöfunzionare,‘û+con“trollare˜c“he˜i˜le˜necessari˜si˜tro“vino˜eettiv‘ÿqÐamen“te˜in˜quelle˜directory‘ÿ*¸.‘P“erŽ¡a.out,‘3´il–0collegamenš¸èto“con“Â-lfoo“¹fa“in“moGdo“c˜he“ld“cerc˜hi“Âlibfoo.sa“¹(condivisa)“e,‘3´in“caso“di“insuccesso,Ž¡Âlibfoo.a–Jª¹(statica).‘RPš¸èer“ELF,“v˜err€à“eseguita“la“ricerca“di“Âlibfoo.so¹,‘ˆ quindi“di“Âlibfoo.a¹.‘RÂlibfoo.so“¹€èŽ¡generalmenš¸ète–U un“collegamen˜to“sim˜bGolico“a“Âlibfoo.so.x¹.ŽŸ#ÃÄ6.4Ž‘¾Compilazione–¸delle“proprie“librerieŽ¤MªÁ6.4.1Ž‘#!\Conš®>trollo–Õdella“v˜ersioneŽ¡¹Come–¶‘qualunque“altro“programma,‘Îíle“librerie“pGossono“conš¸ètenere“errori“c˜he“v˜engono“riscon˜trati“e“risolti“nelŽ¤ ®tempšGo.‘½±Inoltre,‘ߊle–ÃÛlibrerie“p˜ossono“in¸ètro˜durre“n•¸èuo“v“e‘ÃÛcaratteristic“he,‘ߊmo˜dicare–ÃÛl'eetto“di“altre“esisten¸èti,‘ߊoŽ¡rim•¸èuo“v“ere–U quelle“v•¸èecc“hie.‘q€Questo›U p•Gotrebb“e˜costituire˜un˜problema˜p“er˜i˜programmi˜c¸èhe˜le˜utilizzano.Ž¦P•¸èertan“to–si“€è“inš¸ètroGdutto“il“concetto“di“v˜ersione“della“libreria.‘.ÓT‘ÿ*¸utte“le“moGdic˜he“c˜he“pGossono“essere“fatte“a“unaŽ¡libreria–Ònsono“catalogate“in“'minori'“o“'maggiori',‘ì’do•¸èv“e–Ònuna“mošGdica“'minore'“non“in¸èterromp˜e“il“funzionamen¸ètoŽ¡dei›¢v•¸èecc“hi˜programmi˜c“he˜la˜utilizzano.‘X,La˜v“ersione˜di˜una˜libreria˜pu€ò˜essere˜dedotta˜dal˜suo˜nome˜di˜leŽ¡(di–(2fatto,‘1/questo“non“€è“vš¸èero“pGer“quan˜to“riguarda“ELF;“nel“seguito“viene“spiegato“il“motiv˜o):‘[ Âlibfoo.so.1.2Ž¡¹ha–à'1'“come“vš¸èersione“maggiore,‘|e“'2'“come“minore.‘öIl“n˜umero“di“v˜ersione“minore“pu€ò“essere“sv‘ÿqÐariato“-“libGcŽ¡inserisce–Ýjin“esso“il“'livš¸èello“di“patc˜h',›ÿ|assegnando“alle“librerie“nomi“del“tipGo“Âlibc.so.5.2.18¹,˜e“spGesso“sonoŽ¡utilizzate–U lettere,“underscore,“o“quasi“ogni“altro“carattere“ASCIGI.Ž¦Una–y delle“dierenze“principali“tra“il“formato“ELF‘x“e“a.out“consiste“nel“moGdo“in“cui“viene“eseguita“laŽ¡compilazione–U delle“librerie“condivise.‘q€Pš¸èer“prima“cosa“viene“descritto“ELF,“dal“momen˜to“c˜he“€è“pi€ù“semplice.ŽŸ ÖÁ6.4.2Ž‘#!\ELF.–ÕDi“cosa“si“tratta?ŽŸMª¹ELF›“Ú(Executable–”,and“Linking“F‘ÿ*¸ormat)“€è“un“formato“binario“originariamen¸ète“sviluppato“da“USL˜(UNIXŽ¡System–LabGoratories)“e“attualmen¸ète“utilizzato“in“Solaris“e“System“V›~àRelease“4.‘*(A˜seguito“della“sua“aumen¸ètataŽ¡essibilit€à–vçrispGetto“al“pi€ù“v•¸èecc“hio–vçformato“a.out“utilizzato“da“Lin¸èux,‘£Ygli“sviluppatori“di“librerie“GCC›v¯e“C˜hannoŽ¡deciso–U lo“scorso“anno“di“utilizzare“ELF“come“formato“binario“standard“pGer“Lin¸èux.ŽŽŽŒ‹![ Û_2 ý ~?Ÿ„€ÕÁGŽÁ6.‘ñ8Linking’“ú¹¹19ŽŽ ÕÁ ýV¯ÁUteriori‘Õdettagli‘ ÿ`¹Questo–U paragrafo“€è“tratto“dal“doGcumen¸èto“'Â/news-archives/comp.sys.sun.misc¹'.Ž©ËÌ‘'ÿELF‘Ñj(Executable–Ñ‹Linking“F‘ÿ*¸ormat)“€è“il“n•¸èuo“v“o–Ñ‹e“migliorato“formato“di“le“oggetto“in¸ètroGdotto“inŽ¤ ®‘SVR4.‘/ºELF‘›€è–Ímolto“pi€ù“pGotenš¸ète“di“COFF,“nel“fatto“di“essere“estendibile“dall'uten˜te.‘/ºELF‘›v˜ede“unŽ¡‘le–Äoggetto“come“una“lista“di“sezioni“arbitrariamenš¸ète“lunga“(piuttosto“c˜he“come“un“arra˜y“di“en˜tit€àŽ¡‘a–p¥lunghezza“ssa),›w†tali“sezioni,˜a“dierenza“di“quanš¸èto“accade“in“COFF,“non“si“dev˜ono“tro˜v‘ÿqÐare“inŽ¡‘un–u{luogo“spšGecico“e“non“dev¸èono“essere“in“un“ordine“sp˜ecico“ecc.‘Ò‘Gli“uten¸èti“p˜ossono“aggiungereŽ¡‘n•¸èuo“v“e–ùAsezioni“ai“le“oggetto,› ¡se“desiderano“a•¸èv“ere–ùAa“dispGosizione“n•¸èuo“vi–ùAdati.‘RàELF,“inoltre,˜pGossiedeŽ¡‘un–F"formato“di“debugging“molto“pi€ù“pGotenš¸ète“denominato“D˜W‘þã ARF‘Eä(Debugging“With“A˜ttributeŽ¡‘Record–ÍF‘ÿ*¸ormat)“-“attualmenš¸ète“non“suppGortato“completamen˜te“su“Lin˜ux“(ma“ci“si“sta“la˜v˜orando).Ž¡‘Una–DŸlista“link‘ÿqÐata“di“DIE‘Da(o“Debugging“Information“Enš¸ètries)“di“D˜W‘þã ARF‘Dacostituisce“la“sezioneŽ¡‘Â.debug–i&¹di“ELF.“In•¸èv“ece–i&di“essere“un“insieme“di“piccoli“record“a“dimensione“ssa,‘®'ogni“DIE‘hÞdiŽ¡‘D•¸èW‘þã ARF‘con“tiene–Huna“lista“di“lunghezza“arbitraria“di“attributi“complessi“ed“€è“scritto“come“unŽ¡‘albGero–®½di“dati“di“programma.‘~XI–®¦DIE“sono–®½in“grado“di“includere“una“quan¸ètit€à“di“informazioni“diŽ¡‘molto–U maggiore“rispGetto“alla“sezione“Â.debug“¹di“COFF“(come“gra“di“eredit€à“del“C++“ecc).Ž¦‘'ÿL'accesso–QNai“le“ELF›Q a¸èvviene“tramite“la“libreria“di“accesso“ELF˜SVR4“(Solaris“2.0“?),‘Yc¸èheŽ¡‘fornisce–êÕun'inš¸èterfaccia“semplice“e“rapida“alle“parti“pi€ù“complicate“di“ELF.“Uno“dei“v‘ÿqÐan˜taggiŽ¡‘principali–\­deriv‘ÿqÐanš¸èti“dall'utilizzo“della“libreria“di“accesso“ELF‘\«consiste“nel“fatto“c˜he“non“sar€à“maiŽ¡‘necessario–‡êv¸èedere“un“le“ELF‘‡Ýcome“le“Unix,›”œ€è“pGossibile“eseguire“l'accesso“come“le“Elf“*,˜dopGoŽ¡‘una–Icš¸èhiamata“Âelf_open()“¹si“eseguono“c˜hiamate“Âelf_foobar()“¹sulle“sue“compGonen˜ti“in˜v˜ece“diŽ¡‘oGccuparsi–U della“sua“immagine“eettiv›ÿqÐa“su“disco“(cosa“c¸èhe“con“COFF“si“facev˜a“impunemen¸ète).Ž¦I‘Äêv›ÿqÐan¸ètaggi–Åe“gli“sv˜anš¸ètaggi“di“ELF,“e“le“ev˜oluzioni“necessarie“pšGer“eseguire“l'upgrade“di“un“sistema“a.out“p˜erŽ¡suppGortarlo,‘§ÿsono–d9descritti“nell'ELF-HOš¸èWTO‘cóe“non“ho“in˜tenzione“di“ripGeterli“qui.‘žËL'HO˜WTO‘códo˜vrebbGeŽ¡essere–U dispšGonibile“nello“stesso“luogo“in“cui“€è“stato“tro¸èv‘ÿqÐato“questo“do˜cumen¸èto.ŽŸ {³ÁLibrerie–˜·condivise“di“ELF‘ ÿ`¹P¸èer– Ÿeseguire“la“compilazione“di“Âlibfoo.so“¹come“libreria“condivisa,‘+i“passi“diŽ¡base–U hanno“la“seguen¸ète“forma:ŽŸ§õ‘Æ$–¹Ngcc“-fPIC“-c“*.cŽ¤ Š=‘$–¹Ngcc“-shared“-Wl,-soname,libfoo.so.1“-o“libfoo.so.1.0“*.oŽ¡‘$–¹Nln“-s“libfoo.so.1.0“libfoo.so.1Ž¡‘$–¹Nln“-s“libfoo.so.1“libfoo.soŽ¡‘$–¹NLD_LIBRARY_PATH='pwd':$LD_LIBRARY_PATH“;“export“LD_LIBRARY_PATHŽ¦¹Questi–€µcomandi“genererano“una“libreria“condivisa“denominata“Âlibfoo.so.1.0¹,‘«1i“collegamen¸èti“appropriati“pGerŽ¤ ®ld–(Âlibfoo.so¹)“e“il“caricamenš¸èto“dinamico“(Âlibfoo.so.1¹)“pGer“tro˜v‘ÿqÐarla.‘V~P˜er“eseguire“un“collaudo,‘Msi“aggiungeŽ¡la–U directory“corren¸ète“a“ÂLD_LIBRARY_PATH¹.ŽŸؼQuando–‡Ûsi“€è“sicuri“cš¸èhe“la“libreria“funziona,‘”Šdev˜e“essere“spGostata,›”Šad“esempio,˜in“Â/usr/local/lib¹,˜e“dev¸èonoŽ¡essere–õwcreati“appropriati“collegamenš¸èti.‘ R†Il“collegamen˜to“da“Âlibfoo.so.1“¹a“Âlibfoo.so.1.0“¹€è“man˜ten˜utoŽ¡aggiornato–Òda“Âldconfig¹,‘1üc¸èhe“nella“maggior“parte“dei“sistemi“viene“eseguito“come“parte“del“proGcesso“diŽ¡a•¸èvviamen“to.‘OÍIl›ðcollegamen“to˜Âlibfoo.so˜¹dev“e˜essere˜aggiornato˜man“ualmen“te.‘OÍSe˜si˜€è˜scrupGolosi˜nell'eseguireŽ¡l'aggiornamenš¸èto–þdi“tutte“le“parti“di“una“libreria“(ossia“degli“header“le)“con˜tempGoraneamen˜te,‘(×la“cosa“pi€ùŽ¡semplice–Acda“fare“consiste“nel“rendere“Âlibfoo.so–?¬-µ>“Âlibfoo.so.1¹,‘EVin–AcmoGdo“cš¸èhe“ldcong“man˜tenga“corren˜tiŽ¡en•¸ètram“bi–U i“collegamenš¸èti.‘q€In“caso“con˜trario,“p•Gotrebb“e–U in“seguito“v˜ericarsi“ogni“genere“di“stranezza.ŽŸ§õ‘Æ$‘¹NsuŽ¤ Š=‘#–¹Ncp“libfoo.so.1.0“/usr/local/libŽ¡‘#‘¹N/sbin/ldconfigŽ¡‘#–¹N(“cd“/usr/local/lib“;“ln“-s“libfoo.so.1“libfoo.so“)ŽŽŽŒ‹0Ô Û_2 ý ~?Ÿ„€ÕÁGŽÁ6.‘ñ8Linking’“ú¹¹20ŽŽ ÕÁ ýV¯ÁNumerazione–2ãdelle“v®>ersioni,‘STsoname“e“symlink‘e&¹Ogni–Èlibreria“ha“un“Ásoname¹.‘B|Quando“il“linkš¸èer“tro˜v‘ÿqÐaŽ¤ ®uno–ÒÏdi“questi“in“una“libreria“in“cui“sta“eseguendo“una“ricerca,‘ò:nel“binario“viene“incluso“il“soname“in“luogoŽ¡del–]mnome“di“le“eettivš¸èo“ricercato.‘ŠgDuran˜te“l'esecuzione,‘_€il“loader“dinamico“cerc˜her€à“un“le“tramite“il“nomeŽ¡di–q°soname,›xÔnon“con“il“nome“di“le/libreria.‘Ç1P•¸èertan“to,˜una–q°libreria“denominata“Âlibfoo.so“¹p•Gotrebb“e›q°a•¸èv“ere˜ilŽ¡soname–BœÂlibbar.so¹,›FPdi“conseguenza“tutti“i“programmi“collegati“ad“essa,˜all'a•¸èvvio,˜cerc“herebbGero‘BœÂlibbar.so¹.Ž©ؼSemš¸èbra–z essere“una“caratteristica“di“p•Go“ca‘z imp“ortanza,‘¥Ýin˜v˜ece–z €è“la“c˜hia˜v˜e“pšGer“capire“come“su“un“sistema“p˜ossonoŽ¡coGesistere–ÝSdivš¸èerse“v˜ersioni“della“stessa“libreria.‘ Di“fatto,‘ÿ_la“denominazione“standard“delle“librerie“in“Lin˜uxŽ¡consiste–¦»nel“c¸èhiamare“la“libreria,›»"ad“esempio,˜Âlibfoo.so.1.2¹,˜e“assegnare“ad“essa“il“soname“Âlibfoo.so.1¹.Ž¡Se–Éøaggiunš¸èta“in“una“directory“di“libreria“'standard'“(ossia,–ç.Â/usr/lib¹),“ldcong–Éøcreer€à“un“collegamen˜to“sim-Ž¡bGolico›•þÂlibfoo.so.1–?¬-µ>“Âlibfoo.so.1.2˜¹in˜mo•Gdo˜c¸èhe˜sia˜p“ossibile˜tro•¸èv‘ÿqÐare˜l'immagine˜appropriata˜duran“teŽ¡l'esecuzione.‘ëD€È‘Òìnecessario–Ó ancš¸èhe“un“collegamen˜to“Âlibfoo.so–?¬-µ>“Âlibfoo.so.1–Ó ¹anc˜h€é“ld“pGossa“tro˜v‘ÿqÐare“ilŽ¡soname–U corretto“da“utilizzare“duran¸ète“il“link.Ž¦P•¸èertan“to,›ê{quando–Ìœsi“risolv¸èe“un“errore“nella“libreria,˜o“si“aggiungono“n•¸èuo“v“e–Ìœfunzioni“(ogni“moGdica“c¸èhe“nonŽ¡inuenzi–;in“moGdo“negativš¸èo“i“programmi“esisten˜ti),‘BÂsi“eseguir€à“n˜uo˜v‘ÿqÐamen˜te“la“compilazione“man˜tenendo“loŽ¡stesso–soname,‘µ„e“mošGdicando“il“nome“di“le.‘.ÿQuando“si“inseriscono“nella“libreria“delle“mo˜dicš¸èhe“c˜he“causereb-Ž¡bGero–úl'inš¸èterruzione“dei“programmi“esisten˜ti,‘#GIC‘Eóe‘FQMA“GIC‘‹F¹QMAš¸èGIC‘ئ€è–ØÆun“formato“eseguibile“proprio“come“i“v˜ecc˜hi“binari“a.out“(conosciutiŽ¡ancš¸èhe–ùÁcome“ZMA˜GIC),“ma“c˜he“lascia“la“prima“pagina“non“mappata.‘ _bQuesto“consen˜te“c˜he“accada“pi€ùŽ¡facilmenš¸ète–Ehun“riferimen˜to“NULL‘Eddal“momen˜to“c˜he“non“esiste“alcun“mapping“nel“range“0-4096.‘lCCome“eettoŽ¡collaterale,–U i“binari“saranno“di“dimensioni“inferiori“(di“circa“1“K).Ž¦I‘šlinkš¸èer–®obsoleti“suppGortano“solamen˜te“ZMA˜GIC,“quelli“semi-obsoleti“suppGortano“en˜tram˜bi“i“formati,‘ømen˜treŽ¡le–û vš¸èersioni“attuali“suppGortano“solo“QMA˜GIC.“In“realt€à“questo“non“ha“impGortanza,‘ dal“momen˜to“c˜he“il“k˜ernelŽ¡riesce–U ad“eseguire“en•¸ètram“bi–U i“formati.Ž¦Il–U proprio“comando“'le'“doš¸èvrebbGe“essere“in“grado“di“iden˜ticare“se“un“programma“€è“QMA˜GIC.ŽŸ ÖÁP®>osizione–‘Õdei“le‘ ÿ`¹Una–ù>libreria“condivisa“a.out“(DLL)‘ù€è“formata“da“due“le“reali“e“da“un“collegamen¸ètoŽ¡sim•¸èbšGolico.‘P“er–Ž%la“libreria“'Âfoo¹'“utilizzata“come“esempio,‘œfquesti“le“sarebb˜ero“Âlibfoo.sa“¹e“Âlibfoo.so.1.2¹;Ž¡il–U collegamenš¸èto“sim˜bšGolico“sarebb˜e“Âlibfoo.so.1“¹e“pun¸èterebb˜e“all'ultimo“di“questi“le.‘q€Ma“a“cosa“serv¸èono?ŽŽŽŒ‹B Û_2 ý ~?Ÿ„€ÕÁGŽÁ6.‘ñ8Linking’“ú¹¹21ŽŽ ÕÁ ýV¯Duran¸ète–ä3la“compilazione,›øld“ricerca“Âlibfoo.sa¹.‘ºSi“tratta“del“le“'matrice'“della“libreria,˜e“con¸ètiene“tutti“iŽ¤ ®dati–U espGortati“e“i“punš¸ètatori“alle“funzioni“ric˜hieste“pGer“il“collegamen˜to“run“time.Ž©ؼDuranš¸ète–KXl'esecuzione,‘MMil“loader“dinamico“cerca“Âlibfoo.so.1¹.‘n=Si“tratta“di“un“collegamen˜to“sim˜bGolico“anzic˜h€éŽ¡di– Bun“le“reale“in“mošGdo“c¸èhe“le“librerie“p˜ossano“essere“aggiornate“con“vš¸èersioni“pi€ù“recen˜ti“e“corrette“senzaŽ¡proGcurare–r danni“a“nessuna“delle“applicazioni“utilizzanš¸èti“la“libreria“in“quel“momen˜to.‘ÈEDopGo“c˜he“la“n˜uo˜v‘ÿqÐaŽ¡vš¸èersione,‘-ad–ó°esempio“Âlibfoo.so.1.3“¹-“€è“stata“in˜troGdotta,‘-l'esecuzione“di“ldcong“comm˜uter€à“il“collegamen˜toŽ¡anc•¸èh€é›4‡pun“ti˜ad˜essa˜tramite˜un'opGerazione˜atomica,‘; lasciando˜illeso˜ogni˜programma˜c“he˜sta“v‘ÿqÐa˜utilizzandoŽ¡la›U v•¸èecc“hia˜v“ersione.Ž¦Le–¦librerie“DLL‘Qappaiono“spGesso“pi€ù“grandi“delle“loro“conš¸ètroparti“static˜he.‘KRiserv‘ÿqÐano“spazio“pGer“futureŽ¡espansioni–:Ønella“forma“di“'bucš¸èhi'“c˜he“pšGossono“essere“creati“senza“o˜ccupare“spazio“su“disco.‘"©Una“sempliceŽ¡cš¸èhiamata–F#Âcp“¹o“l'utilizzo“del“programma“Âmakehole“¹raggiunger€à“questo“scop•Go.‘lDop“o–F#la“compilazione,‘I"€è“anc˜heŽ¡pGossibile›"rim•¸èuo“v“erli,‘U×dal˜momen“to˜c“he˜gli˜indirizzi˜si˜tro“v‘ÿqÐano˜in˜loGcazioni˜sse.‘ÙžNon˜ten“tare˜di˜rim“uo“v“erliŽ¡dalle–U librerie“ELF.Ž© ÖÁlibQÂc-lite?‘ ÿ`¹Un–ìƒlibšGc-lite“€è“una“v¸èersione“ridotta“della“libreria“lib˜c“p˜er“la“quale“€è“stata“eseguita“la“compilazioneŽ¡in–üxmoGdo“tale“da“stare“su“un“oppš¸èy“disk“ed“essere“sucien˜te“pGer“tutti“i“task“Unix“essenziali.‘gˆNon“includeŽ¡coGdice›õxÂcurse¹,–šÂdbm¹,“Âtermcap˜¹ecc.‘QžSe˜il˜proprio˜Â/lib/libc.so.4˜¹ha˜un˜collegamen¸èto˜con˜un˜lite˜lib,“il˜sistemaŽ¡aš¸èvvisa–U di“sostituirlo“con“una“v˜ersione“completa.Ž¦Á6.4.4Ž‘#!\Linking:‘ problemi‘Õcom®>uniŽŸMª¹Inš¸èviatemi–…i“problemi“deriv‘ÿqÐan˜ti“dal“linking!‘kAnc˜he“se“non“pGotr€ò“fare“nien˜te“pGer“risolv˜erli,‘Ñne“scriv˜er€ò“unŽ¡resoGcon¸èto‘U dettagliato.ŽŸؼÁProgrammi–Õeseguono“il“link“statico“anzic®>h€é“dinamicoŽŽŽ©®‘¹Conš¸ètrollare–Fâdi“a˜v˜ere“i“collegamen˜ti“corretti“anc˜h€é“ld“pGossa“tro˜v‘ÿqÐare“tutte“le“librerie“condivise.‘FÆP˜erŽ¡‘ELF‘àüquesto–ásignica“un“collegamenš¸èto“sim˜bšGolico“Âlibfoo.so“¹p˜er“l'immagine,‘øNin“a.out“un“le“Âlibfoo.sa¹.Ž¡‘Molte–èpšGersone“hanno“riscon¸ètrato“questo“problema“dop˜o“il“passaggio“dai“bin¸èutils“ELF‘´2.5“ai“2.6“-“laŽ¡‘v•¸èersione›¿Dpreceden“te˜ricerca“v‘ÿqÐa˜le˜librerie˜condivise˜in˜un˜moGdo˜'pi€ù˜in“telligen“te'˜pGertan“to˜non˜a“v“ev‘ÿqÐanoŽ¡‘bisogno–² di“creare“tutti“i“collegamenš¸èti.‘;$Il“compGortamen˜to“in˜telligen˜te“€è“stato“eliminato“pGer“compatibilit€àŽ¡‘con–ùaltre“arcš¸èhitetture,‘e“pGerc˜h€é“molto“spšGesso“le“sue“supp˜osizioni“erano“sbagliate“e“causando“pi€ù“guai“diŽ¡‘quan¸èti–U fossero“i“problemi“risolti.ŽŸ®ÁLo–Õstrumenš®>to“DLL“'mkimage'“non“riesce“a“tro˜v‘ÿ\|are“libgccŽŽŽ¦‘¹Da–-˜Âlibc.so.4.5.x“¹e“oltre,›5€Âlibgcc“¹non“€è“pi€ù“condivisa.‘dSP•¸èertan“to,˜€è–-˜necessario“sostituire“le“oGccorrenzeŽ¡‘di–U 'Â-lgcc¹'“con“'Âgcc‘?¬-print-libgcc-file-name¹'.Ž¦‘Inoltre,–U bisogna“cancellare“tutti“i“le“Â/usr/lib/libgcc*¹.‘q€Questo“€è“molto“impGortan¸ète.Ž¤®ÁMessaggi‘ÕÂ__NEEDS_SHRLIB_libc_4–?¬multiply“definedŽŽŽ¦‘¹Altra–U conseguenza“del“problema“descritto“al“punš¸èto“preceden˜te.Ž¡ÁMessaggio–ÕAssertion“failure‘Ê^quando“si“ricompila“una“DLL?ŽŽŽ¦‘¹Questo–omessaggio“criptico“molto“probabilmenš¸ète“signica“c˜he“uno“degli“slot“della“propria“jump“table“€èŽ¤ ®‘andato–§in“o•¸èv“ero“w›§pGoic“h€é˜€è˜stato˜riserv‘ÿqÐato˜tropp•Go˜p“o“co˜spazio˜nel˜le˜jump.v‘ÿqÐars˜originale.‘ƒ€È‘yp“ossi-Ž¡‘bile–QólošGcalizzare“i“colp˜evš¸èoli“eseguendo“il“comando“'Âgetsize¹'“fornito“nel“pacc˜hetto“Âtools-2.17.tar.gz¹.Ž¡‘T‘ÿ*¸utta•¸èvia,‘Ý“probabilmen“te–ÂIl'unica“soluzione“consiste“nel“sostituire“il“nš¸èumero“di“v˜ersione“maggiore“dellaŽ¡‘libreria,–U forzandolo“anc¸èh€é“sia“impGossibile“tornare“indietro.ŽŽŽŒ‹TÆ Û_2 ý ~?Ÿ„€ÕÁGŽÁ6.‘ñ8Linking’“ú¹¹22ŽŽ ÕÁ ýV¯Âld:‘ Xoutput–?¬file“needs“shared“library“libc.so.4ŽŽŽ¤wß‘¹Questo–’accade“solitamenš¸ète“quando“si“sta“eseguendo“il“collegamen˜to“con“librerie“div˜erse“da“libGc“(comeŽ© ®‘le–U librerie“X),“e“si“utilizza“l'opzione“Â-g“¹sulla“riga“di“link“utilizzando“anc¸èhe“Â-static¹.Ž¡‘Gli– ñystub“Â.sa“¹pGer“le“librerie“condivise“conš¸ètengono“solitamen˜te“un“sim˜bGolo“indenitoŽ¦‘Â_NEEDS_SHRLIB_libc_4–‹¹cš¸èhe“viene“risolto“da“Âlibc.sa¹.‘ {T‘ÿ*¸utta˜via,‘žcon“Â-g“¹si“nisce“di“eseguire“ilŽ¦‘collegamenš¸èto–ÏÀcon“Âlibg.a“¹o“Âlibc.a¹,‘nhil“sim˜bšGolo“non“viene“mai“risolto,‘nhp˜ortando“all'errore“sopraŽ¦‘descritto.Ž¡‘In–ù±conclusione,› úaggiungere“Â-static“¹quando“si“compila“con“l'opzione“Â-g¹,˜oppure“non“eseguire“il“collega-Ž¦‘men¸èto–,con“Â-g¹.‘cÕMolto“spšGesso“€è“p˜ossibile“ottenere“informazioni“di“debugging“sucien¸èti“compilando“i“leŽ¦‘individuali–U con“Â-g¹,“ed“eseguendo“il“collegamen¸èto“senza“questa“opzione.ŽŸ"ïÄ6.5Ž‘¾Loading‘¸dinamicoŽ¤Mª¹Questo–U paragrafo“€è“pGer“il“momenš¸èto“piuttosto“brev˜e,“v˜err€à“esteso“in“futuro.ŽŸ §kÁ6.5.1Ž‘#!\ConcettiŽ¡¹Linš¸èux–;`pGossiede“delle“librerie“condivise,‘@†come“si“€è“visto“div˜erse“molte“v˜olte“nell'ultimo“paragrafo.‘hëGran“parteŽ¦del›÷Dla•¸èv“oro˜di˜asso•Gciazione˜dei˜nomi˜a˜lo“cazioni,‘Íc•¸èhe˜tradizionalmen“te˜era˜sv“olto˜al˜momen“to˜del˜link,‘Ídev“eŽ¦essere–U ritardato“al“momenš¸èto“del“load“(caricamen˜to).ŽŸ §kÁ6.5.2Ž‘#!\Messaggi–Õdi“erroreŽ¡¹I‘dlettori–ssono“pregati“di“inš¸èviare“i“proprii“errori“di“link“all'autore,‘#Éc˜he“anc˜he“se“non“pGotr€à“risolv˜erli,‘#Écom˜unqueŽ¦scrivš¸èer€à–U un“resoGcon˜to“dettagliato.ŽŸɳ‘ÕÂcan't–?¬load“library:‘ X/lib/libxxx.so,“Incompatible“versionŽŽŽ¤wß‘¹(solo–}íin“a.out)“Questo“signica“cš¸èhe“non“si“pGossiede“la“v˜ersione“maggiore“aggiornata“della“libreria“xxx.Ž¦‘Non–´à€è“pGossibile“semplicemenš¸ète“creare“un“collegamen˜to“sim˜bGolico“ad“un'altra“v˜ersione“c˜he“si“pGossiede;Ž¦‘nella–a›migliore“delle“ipGotesi“questo“causer€à“un“segfault“nel“proprio“programma.‘–ñSi“consiglia“di“ottenereŽ¦‘una›U n•¸èuo“v‘ÿqÐa˜v“ersione.‘q€Una˜situazione˜simile˜in˜ELF˜pro•Gdurr€à˜un˜messaggio˜del˜tip“oŽŸçž‘/Æftp:–¹Ncan't“load“library“'libreadline.so.2'ŽŸ u‘ÕÂwarning–?¬using“incompatible“library“version“xxxŽŽŽ¡‘¹(solo––üin“a.out)“Si“pGossiede“una“vš¸èersione“minore“della“libreria“pi€ù“v˜ecc˜hia“di“quella“pGosseduta“dallaŽ¦‘pGersona–§^cš¸èhe“ha“compilato“il“programma“in“questione.‘h9Il“programma“funzioner€à“com˜unque.‘h9T‘ÿ*¸utta˜via,Ž¦‘un–U aggiornamen¸èto“non“sarebbGe“una“cattiv‘ÿqÐa“idea.ŽŸ §kÁ6.5.3Ž‘#!\Con®>trollo–Õdelle“opQÂerazioni“del“loader“dinamicoŽŸMª¹Esistono–mBdivš¸èerse“v‘ÿqÐariabili“di“am˜bien˜te“a“c˜he“inuenzano“il“compGortamen˜to“del“loader“dinamico.‘¹åLa“maggiorŽ¦parte–Rödi“esse“sono“pi€ù“utili“a“Âldd“¹di“quanš¸èto“non“lo“siano“pGer“l'uten˜te“medio,‘’ke“pšGossono“essere“imp˜ostateŽ¦eseguendo–U ldd“con“div¸èerse“opzioni.‘q€IncludonoŽŸɳ‘¸ŽŽŽ‘ÂLD_BIND_NOW‘†í¹–‡!normalmenš¸ète,‘°Tle“funzioni“non“sono“ricercate“nelle“librerie“nc˜h€é“non“v˜engono“c˜hiamate.Ž¦‘L'impGostazione– ádi“questa“opzione“attiv‘ÿqÐa“la“ricerca“all'atto“del“caricamen¸èto“della“libreria,‘TdeterminandoŽ¦‘un–;UtempšGo“di“a•¸èvviamen“to–;Umaggiore.‘$Pu€ò“essere“utile“quando“si“vuole“collaudare“un“programma“p˜erŽ¦‘accertarsi–U c¸èhe“sia“eseguito“il“link“di“tutte“le“parti.ŽŽŽŒ‹e¨ Û_2 ý ~?Ÿ„€ÕÁGŽÁ6.‘ñ8Linking’“ú¹¹23ŽŽ ÕÁ ýV¯‘¸ŽŽŽ‘ÂLD_PRELOAD‘Ò‹¹–Ò¬pu€ò“essere“impšGostato“con“un“le“con•¸ètenen“te–Ò¬delle“denizioni“di“funzioni“da“so¸èvrapp˜orre.Ž¤ ®‘A¸èd–Àesempio,›Ýìse“si“sta“eseguendo“un“test“delle“strategie“di“alloGcazione“della“memoria,˜e“si“vuole“sostituireŽ¡‘'mallo•Gc',‘¨Ú€è›dèp“ossibile˜scriv¸èere˜la˜propria˜routine˜sostitutiv‘ÿqÐa,‘¨Úcompilarla˜come˜Âmalloc.o˜¹e˜utilizzare˜iŽ¡‘comandiŽŸ÷É‘/Æ$–¹NLD_PRELOAD=malloc.o;“export“LD_PRELOADŽŸ Š=‘/$‘¹Nprogramma_di_testŽŸ ‘ÂLD_ELF_PRELOAD–éí¹e›êUÂLD_AOUT_PRELOAD“¹sono˜simili,‘O¢ma˜p•Gossono˜essere˜applicati˜solo˜al˜tip“o˜binarioŽ¡‘appropriato.‘aSe–#ïÂLD_ÁqualcosaÂ_PRELOAD›#â¹e“ÂLD_PRELOAD˜¹sono“en•¸ètram“bi›#ïimpGostati,‘-Åv“err€à˜utilizzato˜quelloŽ¡‘pi€ù‘U spGecico.Ž©÷‘¸ŽŽŽ‘ÂLD_LIBRARY_PATH‘¤Q¹–¤§elenco,›ø‰separato“da“virgole,˜di“directory“in“cui“ricercare“le“librerie“condivise.Ž¡‘ÁNon–;&¹ha“eetti“su“ld,›@Xma“solo“duran¸ète“l'esecuzione.‘h×Inoltre,˜€è“disabilitato“pGer“programmi“c¸èhe“eseguonoŽ¡‘setuid–¿Öo“setgid.‘±¢ÂLD_ELF_LIBRARY_PATH›¿º¹e“ÂLD_AOUT_LIBRARY_PATH˜¹pšGossono“anc¸èhe“essere“utilizzati“p˜erŽ¡‘impšGostare––Õla“ricerca“in“mo˜do“dieren¸ète“p˜er“divš¸èersi“tipi“di“binari.‘2ÂLD_LIBRARY_PATH‘–¥¹non“do˜vrebbGe“essereŽ¡‘necessario–3nelle“opGerazioni“normali;‘/×piuttosto“aggiungere“le“directory“a“Â/etc/ld.so.conf/“¹ed“eseguireŽ¡‘ldcong.Ž¦‘¸ŽŽŽ‘ÂLD_NOWARN‘_€¹–`si“applica“solo“ad“a.out.‘ ’4Quando“impGostato“(ossia“con“ÂLD_NOWARN=true;‘?¬exportŽ¡‘LD_NOWARN¹)‘Øeevita–ØÉcš¸èhe“il“¼lo‘ÿ}/ader‘ìF¹fornisca“i“w˜arning“non“fatali“(come“i“messaggi“pGer“incompatibilit€àŽ¡‘di–U v¸èersione“minore).Ž¦‘¸ŽŽŽ‘ÂLD_WARN‘òf¹–òsi“applica“solamen¸ète“a“ELF.“Quando“impGostato,›9rende“i“messaggi,˜solitamen¸ète“fatali,˜Can'tŽ¡‘nd–þzlibrary“dei“semplici“w¸èarning.‘mŽNon“€è“molto“utilizzato“nelle“opšGerazioni“normali,‘(Ðma“€è“imp˜ortan¸èteŽ¡‘pGer‘U ldd.Ž¦‘¸ŽŽŽ‘ÂLD_TRACE_LOADED_OBJECTS‘•‘¹–•¡si“applica“solamenš¸ète“a“ELF,“e“fa“in“moGdo“c˜he“i“programmi“credano“diŽ¡‘essere–U in“esecuzione“sotto“ldd:ŽŸ÷É‘/Æ$–¹NLD_TRACE_LOADED_OBJECTS=true“/usr/bin/lynxŽ¤ Š=‘TÊrlibncurses.so.1–¹N=>“/usr/lib/libncurses.so.1.9.6Ž¡‘TÊrlibc.so.5–¹N=>“/lib/libc.so.5.2.18ŽŸ "Á6.5.4Ž‘#!\Scriv®>ere–Õprogrammi“con“il“loading“dinamicoŽŸMª¹Questo–m€è“molto“simile“al“funzionamenš¸èto“del“suppGorto“di“loading“dinamico“di“Solaris“2.x.‘¹6L'argomen˜to“€èŽ¤ ®trattato–¯ampiamenš¸ète“nel“doGcumen˜to“di“programmazione“ELF›®ódi“H˜J˜Lu“e“nella“pagina“di“man¸èuale“Âdlopen(3)Ž¡manual‘?¬page¹,‘"Øcš¸èhe–Epu€ò“essere“tro˜v‘ÿqÐata“nel“pacc˜hetto“ld.so.‘\Segue“un“semplice“esempio:‘R€è“necessario“eettuareŽ¡il–U link“con“Â-ldlŽŸky‘Æ#include‘¹NŽ¤ Š=‘#include‘¹NŽ¡¡‘main()Ž¡‘{Ž¡‘+å:void‘¹N*libc;Ž¡‘+å:void‘¹N(*printf_call)();Ž¡¡‘+å:if(libc=dlopen("/lib/libc.so.5",RTLD_LAZY))Ž¡‘+å:{Ž¡‘>Êrprintf_call=dlsym(libc,"printf");Ž¡‘>Êr(*printf_call)("hello,‘¹Nworld\n");Ž¡‘+å:}Ž¡¡‘}ŽŽŽŒ‹sÖ Û_2 ý ~?Ÿ„€ÕÁGŽÁ7.‘ñ8Come–Õcon®>tattare“gli“sviluppatori’ìê¹24ŽŽ ÕÁ ýV¯À7Ž‘ÁCome–G\conctattare“gli“sviluppatoriŽŸèÄ7.1Ž‘¾Com unicazione–¸degli“erroriŽ©Mª¹Pš¸èer–vprima“cosa“€è“necessario“cominciare“a“Ácircoscriv®>ere–û‰il“problema¹.‘Õǀȑv„spGecico–vdi“Lin˜ux,‘~èoppure“accadeŽ¤ ®con–gcc“su“altri“sistemi?‘]ÿ€È‘ŽspGecico“della“vš¸èersione“di“k˜ernel?‘]ÿDella“v˜ersione“di“libreria?‘]ÿSparisce“se“si“esegueŽ¡il–U link“statico?‘q€€È“pGossibile“ritagliare“una“piccola“parte“del“programma“c¸èhe“dimostra“l'errore?ŽŸؼF‘ÿ*¸atto–øšquesto,‘axsi“€è“a“conoscenza“del/i“programma/i“in“cui“si“troš¸èv‘ÿqÐa“l'errore.‘ [íP˜er“GCC,“la“proGcedura“diŽ¡comš¸èunicazione–k—degli“errori“€è“spiegata“nel“le“Âinfo¹.‘´æP˜er“ld.so“o“pGer“le“librerie“C‘k’o“maths,‘q5in˜viare“una“mail“aŽ¡¼linux-gc–ÿ}/c@vger.rutgers.e“du–«2¹.‘s¶Se“pGossibile,‘À¶includere“un“brevš¸èe“e“autonomo“programma“c˜he“pGossa“dimostrareŽ¡l'errore,–U e“una“descrizione“sia“di“cosa“si“inš¸ètendev‘ÿqÐa“c˜he“facesse,“sia“di“cosa“fa“eettiv‘ÿqÐamen˜te.ŽŸ#ÃÄ7.2Ž‘¾Aiuto–¸nello“svilupp_úoŽ¦¹Se–ø‡si“desidera“aiutare“lo“sviluppGo“di“GCC‘øo“della“libreria“C,“la“prima“cosa“da“fare“consiste“nell'unirsiŽ¡alla–¾Bmailing“list“¼linux-gc–ÿ}/c@vger.rutgers.e“du–¾B¹.‘¬çSe“si“vuole“semplicemenš¸ète“dare“un'oGcc˜hiata“alle“discussioni,‘Ø‹€èŽ¡pšGossibile–û^consultare“¼http://homer.ncm.c–ÿ}/om/linux-gc“c/–û^¹.‘S•La“seconda“cosa“e“le“successiv¸èe“dip˜endono“solo“dalleŽ¡v•¸èostre‘U in“tenzioni!ŽŸ(ÀœÀ8Ž‘ÁUltime‘G\coseŽŸèÄ8.1Ž‘¾Ringraziamen tiŽŸ#‘'ÿ¹Only›·presiden¸èts,–ÏŸeditors,“and˜p•Geople˜with˜tap“ew•¸èorms˜ha“v“e˜the˜righ“t˜to˜use˜the˜editorial˜w“e.Ž¡‘(Mark‘U T‘ÿ*¸w¸èain)ŽŸؼOvv¸èeroŽ©ؼ‘'ÿSoli– Ði“presidenš¸èti,‘S»gli“editori“e“la“gen˜te“con“il“v˜erme“solitario“hanno“il“diritto“di“usare“il“noiŽ¡‘editoriale.‘q€(Mark‘U T‘ÿ*¸w¸èain)Ž¦Questo– ÑHOš¸èWTO‘ ¿si“basa“molto“strettamen˜te“al“GCC-F‘þã A˜Q‘ ¿di“Mitc˜h˜um“DSouza;‘$ìla“maggior“parte“delle“infor-Ž¡mazioni–¸(pGer“non“dire“una“grande“quanš¸ètit€à“di“testo)“€è“deriv‘ÿqÐato“direttamen˜te“da“quel“do•Gcumen˜to.‘_]Esp“erienzeŽ¡riferite–Úall'autore“all'inš¸èterno“di“questo“HO˜WTO‘Èp•Gotrebb“ero–Úriferirsi“anc˜he“a“Mitc˜h˜um“DSouza;‘&ñgeneralmen˜teŽ¡le–¢åfrasi“del“tipGo“'Non“si“€è“mai“collaudato“questa“parte;‘ÉÇnon“maledite“l'autore“se“il“v¸èostro“disco/sistema“si“€èŽ¡abbrustolito'–S“pšGossono“essere“applicate“a“en•¸ètram“bi.‘püInoltre–S“hanno“con¸ètribuito“a“questo“do˜cumen¸èto“(in“ordineŽ¡ASCI•GI‘yŠp“er–y“nome):‘ºfAndrew“T‘ÿ*¸et,›‚°Axel“Boldt,˜Bill“Metzen¸èthen,˜Bruce“Ev‘ÿqÐans,˜Bruno“Haible,˜Daniel“Barlo¸èw,Ž¡Daniel–¥ýQuinlan,›ÉDa¸èvid“Engel,˜Dirk“Hohndel,˜Eric“Y–ÿ*¸oungdale,˜F“ergus–¥ýHenderson,˜H.J.“Lu,˜Jens“Sc•¸èh“w“eikhardt,Ž¡Kai›šLP•¸èetzk“e,‘«—Mic“hael˜Meissner,‘«—Mitc“h“um˜DSouza,–«—Olaf˜FlebbGe,“P•¸èaul˜Gortmak“er,–«—Rik˜F‘ÿ*¸aith,“Stev•¸èen˜S.˜Dic“k,Ž¡T‘ÿ*¸uomas–VfJ‘VeLukk‘ÿqÐa,‘V·e“naturalmenš¸ète“Lin˜us“T‘ÿ*¸orv‘ÿqÐalds,‘V·senza“il“quale“l'in˜tero“la˜v˜oro“non“a˜vrebbGe“a˜vuto“senso.‘uQViŽ¡prego–Cdi“non“senš¸ètirvi“oesi“se“nella“lista“non“compare“il“v˜ostro“nome“e“a˜v˜ete“con˜tribuito“a“questo“doGcumen˜toŽ¡(come–U HOš¸èWTO“o“come“F‘þã A˜Q).“In˜viate“mail“ed“sar€à“eseguita“la“correzione.ŽŸ#ÃÄ8.2Ž‘¾T‘þàraduzioniŽŸMª¹A•¸èttualmen“te,›¶Ånon–£>esistono“traduzioni“di“questo“doGcumen¸èto“Se“desiderate“farne“una,˜siete“libGeri“di“farlo“maŽ¡vi–#prego“di“farmelo“sapšGere!‘ÛPCi“sono“p˜o˜cš¸èhissime“probabilit€à“c˜he“io“sia“in“grado“di“parlare“la“lingua“in“cuiŽ¡desiderate–U tradurre“il“došGcumen¸èto,“ma“a“parte“questo“sarei“lieto“di“aiutarvi“in“qualsiasi“mo˜do.ŽŽŽŒ‹€e Û_2 ý ~?Ÿ„€ÕÁGŽÁ9.‘ñ8Riferimen®>ti–Õin“italiano’J&s¹25ŽŽ ÕÁ ýV¯Ä8.3Ž‘¾Com unicazioni,–¸opinioni,“correzioniŽ©Mª¹Sono›¿ bGen•¸èv“en“ute˜in“viate˜email˜all'indirizzo˜¼dan@detache–ÿ}/d.demon.c“o.uk˜¹.‘ ¯?La˜c•¸èhia“v“e˜pubblica˜PGP‘¾k(IDŽ¤ ®5F263625)–Õ¯€è“dispGonibile“dalle“pagine“w¸èeb“dell'autore“¼http://ftp.linux.or–ÿ}/g.uk/b“arlow/–Õ¯¹,‘õÓse“ci“sono“necessit€àŽ¡di‘U riserv‘ÿqÐatezza.ŽŸ#ÃÄ8.4Ž‘¾Informazioni‘¸legaliŽ¦¹All–U trademarks“used“in“this“doGcumenš¸èt“are“ac˜kno˜wledged“as“bGeing“o˜wned“b˜y“their“respGectiv˜e“o˜wners.Ž©ؼThis–PdoGcumenš¸èt“is“cop˜yrigh˜t“(C)‘A1996“Daniel“Barlo˜w“¼dan@detache–ÿ}/d.demon.c“o.uk–P¹.‘^åIt“ma˜y“bšGe“repro˜duced“andŽ¡distributed–>‚in“whole“or“in“part,‘xÛin“anš¸èy“medium“ph˜ysical“or“electronic,‘xÛas“long“as“this“cop˜yrigh˜t“notice“isŽ¡retained–4on“all“copies.‘YÜCommercial“redistribution“is“allo•¸èw“ed–4and“encouraged;‘%Øho•¸èw“ev“er,‘cthe–4author“wš¸èould“lik˜eŽ¡to–U bGe“notied“of“anš¸èy“suc˜h“distributions.Ž¦All–õctranslations,‘‰deriv‘ÿqÐativš¸èe“w˜orks,‘‰or“aggregate“w˜orks“incorpGorating“an˜y“Lin˜ux“HO˜WTO‘õKdoGcumen˜ts“m˜ust“bGeŽ¡co•¸èv“ered–Šmunder“this“cop•¸èyrigh“t–Šmnotice.‘fThat“is,‘—Àyš¸èou“ma˜y“not“proGduce“a“deriv‘ÿqÐativ˜e“w˜ork“from“a“HO˜WTO‘Š_andŽ¡impšGose–ÔÉadditional“restrictions“on“its“distribution.‘ð|Exceptions“to“these“rules“ma¸èy“b˜e“gran¸èted“under“certainŽ¡conditions;–U please“conš¸ètact“the“Lin˜ux“HO˜WTO“coGordinator“at“the“address“giv˜en“bGelo˜w.Ž¦In–ô¥short,‘\†wš¸èe“wish“to“promote“dissemination“of“this“information“through“as“man˜y“c˜hannels“as“pGossible.Ž¡Ho•¸èw“ev“er,›Ç›w“e–°¶do“wish“to“retain“cop•¸èyrigh“t–°¶on“the“HO•¸èWTO‘°ždoGcumen“ts,˜and›°¶w“ould˜lik“e˜to˜bGe˜notied˜of˜an“yŽ¡plans–U to“redistribute“the“HO¸èWTOs.Ž¦If–“yš¸èou“ha˜v˜e“questions,‘ 2ïplease“con˜tact“Tim“Byn˜um,‘ 2ïthe“Lin˜ux“HO˜WTO‘]coGordinator,‘ 2ïat“¼linux-Ž¡howto@sunsite.unc.e‘ÿ}/du‘U ¹.Ž©ؼ‘'ÿL'unica–®²licenza“v›ÿqÐalida“€è“quella“originale“in“lingua“inglese.‘:Di“seguito“ne“tro¸èv˜ate“una“traduzioneŽ¡‘abbastanza–U fedele“c¸èhe“pGer€ò“non“ha“alcun“v‘ÿqÐalore.Ž¦T‘ÿ*¸utti–U i“marcš¸èhi“utilizzati“in“questo“doGcumen˜to“sono“riconosciuti“come“appartenen˜ti“ai“rispGettivi“proprietari.Ž©ؼQuesto– ådoGcumenš¸èto“ha“cop˜yrigh˜t“(C)‘ ¸1996“di“Daniel“Barlo˜w“¼dan@detache–ÿ}/d.demon.c“o.uk– å¹.‘5mPu€ò“essere“riproGdot-Ž¡to–'ôe“distribuito“completamen¸ète“o“in“parte,›\©su“ogni“mezzo“sico“o“elettronico,˜purc¸èh€é“questo“messaggio“diŽ¡cop•¸èyrigh“t–NDsia“man•¸èten“uto–NDin“tutte“le“copie.‘â€È‘Nconsenš¸ètita“e“incoraggiata“la“ridistribuzione“commerciale;‘¥ãtutta˜via,Ž¡l'autore–U gradirebbGe“essere“informato“su“ciascuna“di“tali“distribuzioni.Ž¦T‘ÿ*¸utte– $le“traduzioni,›;%la•¸èv“ori– $deriv‘ÿqÐati,˜o“la•¸èv“ori– $aggregati“cš¸èhe“includono“un“qualunque“doGcumen˜to“Lin˜ux“dev˜eŽ¡essere–º$copšGerto“da“questo“messaggio“di“cop•¸èyrigh“t.‘ ŒOssia,‘Óenon–º$€è“p˜ossibile“pro˜durre“un“la•¸èv“oro–º$deriv‘ÿqÐato“da“unŽ¡HO¸èWTO‘ñˆe–ñ°impšGorre“delle“restrizioni“addizionali“sulla“sua“distribuzione.‘G1Eccezioni“a“queste“regole“p˜ossonoŽ¡essere–ßammesse“sotto“particolari“condizioni;‘$si“prega“di“conš¸ètattare“il“coGordinatore“degli“HO˜WTO‘Þìdi“Lin˜uxŽ¡all'indirizzo–U sotto“ripGortato.Ž¦In–¾¡brevš¸èe,‘Ùdesideriamo“prom˜uo˜v˜ere“la“diusione“di“queste“informazioni“attra˜v˜erso“pi€ù“canali“pGossibile.‘®T‘ÿ*¸ut-Ž¡ta•¸èvia,‘Ydesideriamo›%zanc“he˜man“tenere˜il˜cop“yrigh“t˜sui˜doGcumen“ti˜HO“WTO,˜e˜v“orremmo˜essere˜informati˜seŽ¡qualcuno–U ha“inš¸ètenzione“di“ridistribuire“gli“HO˜WTO.Ž¦Se›4a•¸èv“ete˜delle˜domande,‘;con“tattate˜Tim˜Byn“um,‘;il˜coGordinatore˜degli˜HO“WTO‘4ydi˜Lin“ux,‘;all'indirizzo˜¼linux-Ž¡howto@sunsite.unc.e‘ÿ}/du–U ¹tramite“email.ŽŸ(ÀœÀ9Ž‘ÁRiferimencti–G\in“italianoŽŸ¿:¹Questa–’ÿsezione“ripšGorta“riferimen¸èti“a“do˜cumen¸èti“italiani.‘0ËNel“caso“in“cui“un“do˜cumen¸èto“non“sia“ancora“tradottoŽ¡si–U rimanda“al“WEB“serv¸èer“del“Pluto.ŽŽŽŒ‹: Û_2 ý ~?Ÿ„€ÕÁGŽÁ10.‘ñ8Indice‘ÕAnalitico’dG¹26ŽŽ ÕÁ ýV¯‘¸ŽŽŽ‘¹[1]‘U ¼http://www.pluto.linux.it/ildp/HO•¾˜WTO/ELF-HO“WTO.htmlŽ¤.F‘¸ŽŽŽ‘¹[2]–”L¼http://www.pluto.linux.it/ildp/“¹WEB‘”servš¸èer“del“PLUTO,“sono“dispGonibili“anc˜he“le“traduzioni“di“altriŽŸ ®‘HO¸èWTO.Ž¡‘¸ŽŽŽ‘¹[3]‘U ¼http://www.pluto.linux.it/ildp/HO•¾˜WTO/GCC-HO“WTO.htmlŽŸ(‰™À10Ž‘¬%Indice‘G\AnaliticoŽŸT«‘ÕÂ-fwritable-stringsŽŽŽ©n-‘¹4.3.3–U (39)“4.3.9“(56)Ž¡‘ÕÁ/lib/cppŽŽŽ¦‘¹3.2‘U (16)Ž¡‘ÕÁa.outŽŽŽ¦‘¹1.1‘U (1)Ž¡‘ÕÂarŽŽŽ¦‘¹2.5‘U (10)Ž¡‘ÕÂasŽŽŽ¦‘¹2.5‘U (8)Ž¡‘Õµ<Áasm/*.hµ>ŽŽŽ¦‘¹3.3‘U (19)Ž¡‘ÕÂatoi()ŽŽŽ¦‘¹4.3.4‘U (40)Ž¡‘ÕÂatol()ŽŽŽ¦‘¹4.3.4‘U (41)Ž¡–ÕÁbinaries“toQÂo“bigŽŽŽ¦‘¹5.2.1–U (63)“6.1“(65)“6.4.4“(77)Ž¡‘ÕÂcos()ŽŽŽ¦‘¹6.2‘U (68)Ž¡‘ÕÁdebuggingŽŽŽ¦‘¹5.2‘U (59)Ž¡‘ÕÂdlopen()ŽŽŽ¦‘¹6.5.4‘U (82)Ž¡‘ÕÂdlsym()ŽŽŽ¦‘¹6.5.4‘U (83)Ž¡‘ÕÁdoQÂcumen®>tazioneŽŽŽ¦‘¹2.2‘U (4)Ž¡‘ÕÁEINTRŽŽŽ¦‘¹4.3.8‘U (52)ŽŽŽŒ‹Ÿp Û_2 ý ~?Ÿ„€ÕÁGŽÁ10.‘ñ8Indice‘ÕAnalitico’dG¹27ŽŽ ÕÁ ýV¯‘ÕÁelfŽŽŽ¤•ï‘¹1.1–U (0)“6.4.2“(71)Ž©}Ê‘ÕÂexecl()ŽŽŽ¡‘¹4.3.10‘U (57)Ž¦‘ÕÂfcntlŽŽŽ¡‘¹4.3.6‘U (47)Ž¦‘ÕÂFD_CLRŽŽŽ¡‘¹4.3.6‘U (44)Ž¦‘ÕÂFD_ISSETŽŽŽ¡‘¹4.3.6‘U (45)Ž¦‘ÕÂFD_SETŽŽŽ¡‘¹4.3.6‘U (43)Ž¦‘ÕÂFD_ZEROŽŽŽ¡‘¹4.3.6‘U (46)Ž¦‘ÕÂfileŽŽŽ¡‘¹1.1‘U (2)Ž¦‘Õµ<Áoat.hµ>ŽŽŽ¡‘¹3.3‘U (20)Ž¦‘ÕÁgccŽŽŽ¡‘¹2.3‘U (6)Ž¦‘ÕÂgcc‘?¬-fomit-frame-pointerŽŽŽ¡‘¹5.2.1‘U (61)Ž¦‘ÕÂgcc‘?¬-gŽŽŽ¡‘¹5.2.1‘U (60)Ž¦–ÕÁgcc“-vŽŽŽ¡‘¹3.1‘U (14)Ž¦–ÕÁgcc,“errori“(bug)ŽŽŽ¡‘¹3.1–U (15)“4.2.1“(28)“4.2.2“(29)“7.1“(84)Ž¦–ÕÁgcc,“opzioni“(ag)ŽŽŽ¡‘¹3.1–U (13)“4.1“(25)“4.2.1“(26)Ž¦‘ÕÁgdbŽŽŽ¡‘¹5.2.2‘U (64)Ž¦–ÕÁheader“leŽŽŽ¡‘¹3.3‘U (17)Ž¦–ÕÁcš®>hiamate“a“sistema“in˜terrotteŽŽŽ¡‘¹4.3.8‘U (51)ŽŽŽŒ‹£× Û_2 ý ~?Ÿ„€ÕÁGŽÁ10.‘ñ8Indice‘ÕAnalitico’dG¹28ŽŽ ÕÁ ýV¯‘ÕÂldŽŽŽ¤•ï‘¹2.5‘U (9)Ž©}Ê–ÕÂLD_*“Áv‘ÿ\|ariabili“d'am•®>bien“teŽŽŽ¡‘¹6.5.3‘U (80)Ž¦‘ÕÁlddŽŽŽ¡‘¹6.5.3‘U (81)Ž¦‘ÕÁlibQÂcŽŽŽ¡‘¹2.4‘U (7)Ž¦‘ÕÂlibg.aŽŽŽ¡‘¹5.2.1‘U (62)Ž¦‘ÕÁlibgccŽŽŽ¡‘¹6.4.4‘U (79)Ž¦‘Õµ<Álimits.hµ>ŽŽŽ¡‘¹3.3‘U (21)Ž¦‘ÕÁlin®>tŽŽŽ¡‘¹5.1‘U (58)Ž¦‘Õµ<Álin®>ux/*.hµ>ŽŽŽ¡‘¹3.3‘U (18)Ž¦–ÕÁpagine“del“man®>ualeŽŽŽ¡‘¹2.2‘U (5)Ž¦‘Õµ<Âmath.hµ>ŽŽŽ¡‘¹6.2‘U (70)Ž¦‘ÕÁmathsŽŽŽ¡‘¹6.2‘U (69)Ž¦‘ÕÂmktemp()ŽŽŽ¡‘¹4.3.9‘U (55)Ž¦‘ÕÁottimizzazioneŽŽŽ¡‘¹4.2.1‘U (27)Ž¦‘ÕÁQMA®>GICŽŽŽ¡‘¹6.4.3‘U (76)Ž¦–ÕÁsegmen®>tation“faultŽŽŽ¡‘¹4.2.2–U (30)“4.3.9“(54)Ž¦–ÕÁsegmen®>tation“fault,“in“GCCŽŽŽ¡‘¹4.2.2‘U (33)Ž¦‘ÕÁselect()ŽŽŽ¡‘¹4.3.7‘U (50)ŽŽŽŒ‹§Œ Û_2 ý ~?Ÿ„€ÕÁGŽÁ10.‘ñ8Indice‘ÕAnalitico’dG¹29ŽŽ ÕÁ ýV¯‘ÕÂSIGBUSŽŽŽ¤•ï‘¹4.3.2‘U (34)Ž©}Ê‘ÕÂSIGEMTŽŽŽ¡‘¹4.3.2‘U (35)Ž¦‘ÕÂSIGIOTŽŽŽ¡‘¹4.3.2‘U (36)Ž¦‘ÕÁSIGSEGVŽŽŽ¡‘¹4.2.2–U (31)“4.3.9“(53)Ž¦–ÕÁSIGSEGV,“in“gccŽŽŽ¡‘¹4.2.2‘U (32)Ž¦‘ÕÂSIGSYSŽŽŽ¡‘¹4.3.2‘U (38)Ž¦‘ÕÂSIGTRAPŽŽŽ¡‘¹4.3.2‘U (37)Ž¦‘ÕÂsin()ŽŽŽ¡‘¹6.2‘U (67)Ž¦‘ÕÁsonameŽŽŽ¡‘¹6.4.2‘U (73)Ž¦‘ÕÂsprintf()ŽŽŽ¡‘¹4.3.5‘U (42)Ž¦–ÕÁlibrerie“collegate“staticamen®>te,“in“moQÂdo“inattesoŽŽŽ¡‘¹6.1–U (66)“6.4.4“(78)Ž¦‘Õµ<Ástdarg.hµ>ŽŽŽ¡‘¹3.3‘U (23)Ž¦‘Õµ<Ástddef.hµ>ŽŽŽ¡‘¹3.3‘U (24)Ž¦‘ÕÂstringsŽŽŽ¡‘¹2.5‘U (11)Ž¦‘Õµ<Âsys/time.hµ>ŽŽŽ¡‘¹4.3.6‘U (48)Ž¦‘Õµ<Âunistd.hµ>ŽŽŽ¡‘¹4.3.6‘U (49)Ž¦‘Õµ<Áv‘ÿ\|arargs.hµ>ŽŽŽ¡‘¹3.3‘U (22)Ž¦–ÕÁnš®>umeri“di“v˜ersioneŽŽŽ¡‘¹3.1–U (12)“6.4.2“(74)ŽŽŽŒ‹«1 Û_2 ý ~?Ÿ„€ÕÁGŽÁ10.‘ñ8Indice‘ÕAnalitico’dG¹30ŽŽ ÕÁ ýV¯–ÕÁcose“misterioseŽŽŽ¤®‘¹6.4.2‘U (72)ŽŸ®‘ÕÁZMA®>GICŽŽŽ¡‘¹6.4.3‘U (75)ŽŽŽŒø®÷ƒ’À;èÛ_2ÕÁGóqLË ectt0900ó¥!¢N ecbx1200óqLË ectt1000ó]fŒ ecbx1000ó&Lt$ffffecbx1440óø8‹ ecsi1000óŒ6 ecss1000ó½HЃ ecti1000óþÖëI½q½qecss2074ó 1ê± ecrm1000ó !",š cmsy10ó  b> cmmi10ù¯Òßßßßßßß