ΠžΠΏΡ†ΠΈΠΈ gcc. ΠžΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ для x86 GCC. ΠžΠΏΡ†ΠΈΠΈ компилятора для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ

ОБ Linux появилась сначала Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠ°ΠΊ ядро систСмы. К соТалСнию, ядро само ΠΏΠΎ сСбС Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ; ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ Π½ΡƒΠΆΠ½Π° рСгистрация, ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ, компиляция Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈ Ρ‚.Π΄. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ систСму ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ, Π² Ρ€Π°ΠΌΠΊΠ°Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° GNU Π±Ρ‹Π»ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ Ρ€Π°Π·Π½Ρ‹Π΅ срСдства. Они прСдставляли собой ΠΊΠ»ΠΎΠ½Ρ‹ ΠΏΠΎΡ…ΠΎΠΆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΈΠΌΠ΅Π²ΡˆΠΈΡ…ΡΡ Π² UNIX ΠΈ UNIX-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… систСмах Ρ‚ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ. ΠŸΡ€Π΅Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ систСмы Linux Π² ΠΏΠΎΠ΄ΠΎΠ±ΠΈΠ΅ UNIX-систСмы установило ΠΏΠ΅Ρ€Π²Ρ‹Π΅ стандарты для Linux, прСдоставляя программистам Π½Π° языкС Π‘ Π·Π½Π°ΠΊΠΎΠΌΡƒΡŽ Ρ€Π°Π±ΠΎΡ‡ΡƒΡŽ срСду.

Π Π°Π·Π½Ρ‹Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ ОБ UNIX (Π° ΠΏΠΎΠ·Π΄Π½Π΅Π΅ Linux) вставляли собствСнныС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π² ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π»ΠΈ Π² состав систСмы, ΠΈ структура ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΈΠΌΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… систСм Ρ‚ΠΎΠΆΠ΅ слСгка ΠΎΡ‚Π»ΠΈΡ‡Π°Π»Π°ΡΡŒ. ВсС это затрудняло созданиС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, способных Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Π² Ρ€Π°Π·Π½Ρ‹Ρ… систСмах. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, программист Π½Π΅ ΠΌΠΎΠ³ Π΄Π°ΠΆΠ΅ ΠΏΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности систСмы Π±Ρ‹Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Ρ‹ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ, ΠΈΠ»ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡΡŒ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ мСстС.

Π‘Ρ‚Π°Π»ΠΎ ясно, Ρ‡Ρ‚ΠΎ для сохранСния подобия UNIX-систСм Π½ΡƒΠΆΠ½Π° стандартизация, ΠΈ такая Ρ€Π°Π±ΠΎΡ‚Π° сСйчас вСдСтся.

Π‘ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ стандарты двигались Π²ΠΏΠ΅Ρ€Π΅Π΄, Π½ΠΎ ΠΈ ОБ Linux с Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»ΡΡŽΡ‰Π΅ΠΉ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒΡŽ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Π»Π°ΡΡŒ сообщСством, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠ°Π½Π½Ρ‹ΠΌ коммСрчСскими организациями, Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΊΠ°ΠΊ Red Hat ΠΈ Canonical, ΠΈ Π΄Π°ΠΆΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ Π½Π΅-Linux, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΡ€ΠΏΠΎΡ€Π°Ρ†ΠΈΠ΅ΠΉ IBM. По ΠΌΠ΅Ρ€Π΅ развития Linux наряду с Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΎΠΉ ΠΊΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΠΈ компиляторов gcc Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ слСдила Π·Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ стандартами, Π½ΠΎ ΠΈ опрСдСляла Π½ΠΎΠ²Ρ‹Π΅ стандарты, Ссли ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΊΠ°Π·Ρ‹Π²Π°Π»ΠΈΡΡŒ нСэффСктивными. Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ОБ Linux ΠΈ связанныС с нСю ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ срСдства ΠΈ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΈΡΡŒ всС Π±ΠΎΠ»Π΅Π΅ популярными, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ UNIX-систСм Π½Π°Ρ‡Π°Π»ΠΈ Π²Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния Π² свои ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΈΡ… Π±ΠΎΠ»Π΅Π΅ совмСстимыми с ОБ Linux.

Π’ этой Π·Π°ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ‹ собираСмся Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ стандарты Linux, обращая Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π°Ρ‚Π΅ области, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π·Π½Π°Ρ‚ΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΠΈΡΠ°Ρ‚ΡŒ прилоТСния, Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π² Π²Π°ΡˆΠΈΡ… систСмах Linux послС ΠΈΡ… обновлСния, Π½ΠΎ ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ Π² Π΄Ρ€ΡƒΠ³ΠΈΠ΅ дистрибутивы Linux, Π° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈ Π² UNIX-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Π΅ систСмы, обСспСчивая, Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, совмСстноС использованиС Π²Π°ΡˆΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Π’ особСнности ΠΌΡ‹ коснСмся ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… Ρ‚Π΅ΠΌ:

β–‘ стандарт языка программирования Π‘;

β–‘ стандарты UNIX, Π² особСнности POSIX, Ρ€Π°Π·Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ IEEE, ΠΈ стандарт Single UNIX Specification, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ Open Group;

β–‘ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Free Standards Group, Π² особСнности Linux Standard Base, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ ΠΌΠ°ΠΊΠ΅Ρ‚ стандартной Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы Linux.

Π₯ΠΎΡ€ΠΎΡˆΠ΅ΠΉ ΠΎΡ‚ΠΏΡ€Π°Π²Π½ΠΎΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ для знакомства со стандартами, относящимися ΠΊ ОБ Linux, слуТит стандарт Linux Standard Base (LSB), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° Web- сайтС Linux Foundation ΠΏΠΎ адрСсу http://www.linux-foundation.org/ .

ΠœΡ‹ Π½Π΅ собираСмся ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ содСрТаниС стандартов, ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎ ΠΎΠ±ΡŠΠ΅ΠΌΡƒ сравнимы с Π΄Π°Π½Π½ΠΎΠΉ ΠΊΠ½ΠΈΠ³ΠΎΠΉ. ΠœΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ вашС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ стандарты, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… слСдуСт Π·Π½Π°Ρ‚ΡŒ, Π΄Π°Ρ‚ΡŒ Π²Π°ΠΌ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠ΅ историчСскиС свСдСния ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ Ρ€Π°Π·Π²ΠΈΠ²Π°Π»ΠΈΡΡŒ эти стандарты, ΠΈ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, ΠΊΠ°ΠΊΠΈΠ΅ ΠΈΠ· Π½ΠΈΡ… ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌΠΈ ΠΏΡ€ΠΈ написании Π²Π°ΡˆΠΈΡ… собствСнных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Π―Π·Ρ‹ΠΊ программирования Π‘

Π―Π·Ρ‹ΠΊ программирования Π‘ - de facto язык программирования ОБ Linux, поэтому, для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° Π‘ для Linux, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Π΅Π³ΠΎ истоках, ΡƒΠ·Π½Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ мСнялся язык, ΠΈ, Ρ‡Ρ‚ΠΎ особСнно Π²Π°ΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° соотвСтствиС стандартам.

ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ ΡƒΡ€ΠΎΠΊ истории

Π’Π΅ΠΌ, ΠΊΡ‚ΠΎ Π½Π΅ слишком Π»ΡŽΠ±ΠΈΡ‚ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ, Π½Π΅ стоит Π±Π΅ΡΠΏΠΎΠΊΠΎΠΈΡ‚ΡŒΡΡ: эта ΠΊΠ½ΠΈΠ³Π° ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠΈ, Π° Π½Π΅ ΠΎΠ± истории, поэтому ΠΎΠ±Π·ΠΎΡ€ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‡Π΅Π½ΡŒ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΌ.

Π―Π·Ρ‹ΠΊ программирования Π‘ появился Π² Π½Π°Ρ‡Π°Π»Π΅ 1970-Ρ… Π³ΠΎΠ΄ΠΎΠ² ΠΈ Π±Ρ‹Π» основан отчасти Π½Π° Π±ΠΎΠ»Π΅Π΅ Ρ€Π°Π½Π½Π΅ΠΌ языкС программирования BCPL ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΡ… для языка Π’. ДСннис Π ΠΈΡ‚Ρ‡ΠΈ (Dennis М. Ritchie) написал руководство ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для языка Π² 1974 Π³., ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² это ΠΆΠ΅ врСмя Π‘ Π±Ρ‹Π» использован ΠΊΠ°ΠΊ язык программирования для ΠΏΠ΅Ρ€Π΅Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ядра UNIX Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°Ρ… PDP-11. Π’ 1978 Π³. Π‘Ρ€Π°ΠΉΠ°Π½ ΠšΠ΅Ρ€Π½ΠΈΠ³Π°Π½ (Brian W. Kernighan) ΠΈ Π ΠΈΡ‚Ρ‡ΠΈ написали классичСскоС руководство ΠΏΠΎ, языку "The Π‘ Programming Language" ("Π―Π·Ρ‹ΠΊ программирования Π‘").

ΠžΡ‡Π΅Π½ΡŒ быстро язык ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Π» Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ, ΠΎΠ±ΡƒΡΠ»ΠΎΠ²Π»Π΅Π½Π½ΡƒΡŽ, нСсомнСнно, отчасти быстрым ростом популярности UNlX-систСм, Π½ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΈ своими возмоТностями ΠΈ понятным синтаксисом. Бинтаксис языка Π‘ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π» Ρ€Π°Π·Π²ΠΈΠ²Π°Ρ‚ΡŒΡΡ согласованно, Π½ΠΎ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΎΠ½ измСнялся всС большС ΠΈ большС ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΌ описаниСм, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹ΠΌ Π² ΠΊΠ½ΠΈΠ³Π΅, ΡΡ‚Π°Π½ΠΎΠ²ΠΈΠ»ΠΎΡΡŒ ясно, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ΅Π½ стандарт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ соотвСтствовал Π±Ρ‹ соврСмСнному ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»Π΅Π½ΠΈΡŽ ΠΈ Π±Ρ‹Π» Π±ΠΎΠ»Π΅Π΅ строгим.

Π’ 1983 Π³. ANSI (American National Standards Institute, АмСриканский институт стандартов) основал ΠΊΠΎΠΌΠΈΡ‚Π΅Ρ‚ стандартов X3J11 для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ‡Π΅Ρ‚ΠΊΠΎΠ³ΠΎ ΠΈ строгого опрСдСлСния языка. ΠŸΠΎΠΏΡƒΡ‚Π½ΠΎ ΠΎΠ±Π΅ ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ вносили Π² язык Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ измСнСния, Π² особСнности придавая Π΅ΠΌΡƒ Π΄ΠΎΠ»Π³ΠΎΠΆΠ΄Π°Π½Π½ΡƒΡŽ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Ρ‚ΠΈΠΏΡ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π½ΠΎ Π² основном ΠΊΠΎΠΌΠΈΡ‚Π΅Ρ‚ просто вносил ΡΡΠ½ΠΎΡΡ‚ΡŒ ΠΈ логичСскоС обоснованиС ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ опрСдСлСния Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ составляло ΠΎΠ±Ρ‰Π΅ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ языка. ΠžΠΊΠΎΠ½Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ стандарт Π±Ρ‹Π» ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Π² 1989 Π³. ΠΊΠ°ΠΊ ANSI Standard Programming Language Π‘, X3.159-1989 ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ C89, ΠΈΠ½ΠΎΠ³Π΄Π° ΠΈΠΌΠ΅Π½ΡƒΠ΅ΠΌΡ‹ΠΉ C90. (Π­Ρ‚ΠΎΡ‚ послСдний прСвратился Π² стандарт ISO/IEC 9899:1990, Programming Languages - Π‘. Оба стандарта Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹.)

Как ΠΈ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° стандартов, публикация Π½Π΅ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ»Π° Ρ€Π°Π±ΠΎΡ‚Ρƒ ΠΊΠΎΠΌΠΈΡ‚Π΅Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°Π» ΡƒΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ нСточности, ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ Π² спСцификации, ΠΈ Π² 1993 Π³. Π½Π°Ρ‡Π°Π» Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π°Π΄ Π½ΠΎΠ²ΠΎΠΉ вСрсиСй стандарта, Π½Π°Π·Π²Π°Π½Π½ΠΎΠ³ΠΎ C9X. ΠšΠΎΠΌΠΈΡ‚Π΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π», Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²ΠΊΠΈ ΠΈ обновлСния ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ стандарта Π² 1994-1996 Π³Π³.

Новая вСрсия стандарта Π±Ρ‹Π»Π° сдСлана Π² 1990 Π³Π³. ΠΈ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎ стала стандартом Π‘99; ΠΎΠ½Π° Π±Ρ‹Π»Π° принята ISO ΠΊΠ°ΠΊ стандарт ISO/IEC 9899:1999. Π”ΠΎ сих ΠΏΠΎΡ€ сущСствуСт Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠΌΠΈΡ‚Π΅Ρ‚ J11, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдит Π·Π° стандартизациСй языка Π‘ ΠΈ Π΅Π³ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Π½ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ ΠΏΠΎΠ΄ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π³Ρ€ΡƒΠΏΠΏΡ‹ International Committee for Information Technology Standards (ΠœΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΈΡ‚Π΅Ρ‚ ΠΏΠΎ ΠΏΡ€ΠΎΠΌΡ‹ΡˆΠ»Π΅Π½Π½Ρ‹ΠΌ стандартам Π² сфСрС ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ). Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΏΠΎ стандартизации Π‘ см. Π½Π° Web-сайтС http://j11.incits.org/ .

ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ компиляторов GNU

ПослС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π° Emacs (Π΄Π°, ΠΌΡ‹ любим Emacs) ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π²Π°ΠΆΠ½Ρ‹ΠΌ достиТСниСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° GNU, ΠΊΠ°ΠΊ ΡƒΠΏΠΎΠΌΠΈΠ½Π°Π»ΠΎΡΡŒ Π² Π³Π»Π°Π²Π΅ 1, стал ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ бСсплатный компилятор Π‘, gcc, пСрвая ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ вСрсия ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±Ρ‹Π»Π° Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½Π° Π² 1987 Π³.

ΠŸΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ имя gcc Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²Ρ‹Π²Π°Π»ΠΎΡΡŒ ΠΊΠ°ΠΊ GNU Π‘ Compiler (компилятор Π‘ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° GNU), Π½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ базовая рабочая срСда компилятора Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΡ… языков программирования, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ Π‘++, Objective-C, FORTRAN, Java ΠΈ Ada, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ для этих языков, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π±Ρ‹Π»ΠΎ Π·Π°ΠΌΠ΅Π½Π΅Π½ΠΎ Π½Π° Π±ΠΎΠ»Π΅Π΅ подходящСС GNU Compiler Collection (коллСкция компиляторов GNU).

gcc всСгда Π±Ρ‹Π» ΠΈ ΠΏΠΎΡ…ΠΎΠΆΠ΅ останСтся стандартным компилятором для Linux ΠΈ Π‘ ΠΈΠ»ΠΈ Π‘++, основного языка для написания ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π² ОБ Linux. Π˜ΡΡ…ΠΎΠ΄Π½ΡƒΡŽ страницу gcc ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎ адрСсу http://gcc.gnu.org/ .

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π‘ GNU всСгда Ρ…ΠΎΡ€ΠΎΡˆΠΎ отслСТивал Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ стандарта языка Π‘, хотя ΠΎΠ½ допускаСт Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ языка, ΠΈ, бСзусловно, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π·Π°Π΄Π΅Ρ€ΠΆΠΊΠΈ, ΠΊΠ°ΠΊ ΠΏΠΎΡ‡Ρ‚ΠΈ Ρƒ всСх компиляторов, ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠΌ стандарта ΠΈ появлСниСм вСрсий компиляторов, Ρ‚ΠΎΡ‡Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… этой спСцификации. ΠŸΠΎΡ€ΠΎΠΉ происходит ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅, ΠΈ gcc прСдвосхищаСт слабыС измСнСния стандарта, Ρ‡Ρ‚ΠΎ Ρ‚ΠΎΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ ΡΠ±ΠΈΠ²Π°Ρ‚ΡŒ с Ρ‚ΠΎΠ»ΠΊΡƒ. Π£ gcc Π΅ΡΡ‚ΡŒ ряд ΠΎΠΏΡ†ΠΈΠΉ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ…, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… Π·Π°Π΄Π°Ρ‚ΡŒ Π²Π΅Ρ€ΡΠΈΡŽ стандарта языка Π‘, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ компилятор, Π° Ρ‚Π°ΠΊΠΆΠ΅ ряд Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΎΠΏΡ†ΠΈΠΉ для управлСния ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒΡŽ придирчивости ΠΈΠ»ΠΈ строгости компилятора.

ΠžΠΏΡ†ΠΈΠΈ gcc

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΠΊΠΎΠ΅-Ρ‡Ρ‚ΠΎ ΠΎ стандартС Π‘, Π΄Π°Π²Π°ΠΉΡ‚Π΅ рассмотрим ΠΎΠΏΡ†ΠΈΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ компилятор gcc для Π³Π°Ρ€Π°Π½Ρ‚ΠΈΠΈ соотвСтствия стандарту языка Π‘, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅. Π•ΡΡ‚ΡŒ Ρ‚Ρ€ΠΈ способа, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ваш ΠΊΠΎΠ΄ Π½Π° Π‘ соотвСтствуСт стандартам ΠΈ Π½Π΅ содСрТит изъянов: ΠΎΠΏΡ†ΠΈΠΈ, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π²Π΅Ρ€ΡΠΈΡŽ стандарта, соотвСтствия с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Ρ‹ Π΄ΠΎΠ±ΠΈΠ²Π°Ρ‚ΡŒΡΡ, опрСдСлСния, ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΈ ΠΎΠΏΡ†ΠΈΠΈ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ, ΠΈΠ½ΠΈΡ†ΠΈΠΈΡ€ΡƒΡŽΡ‰ΠΈΠ΅ Π±ΠΎΠ»Π΅Π΅ ΡΡ‚Ρ€ΠΎΠ³ΡƒΡŽ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.

Π£ gcc Π΅ΡΡ‚ΡŒ ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ ΠΎΠΏΡ†ΠΈΠΉ, ΠΈ здСсь ΠΌΡ‹ рассмотрим лишь Ρ‚Π΅ ΠΈΠ· Π½ΠΈΡ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ считаСм Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π²Π°ΠΆΠ½Ρ‹ΠΌΠΈ. ΠŸΠΎΠ»Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Ρ‡Π΅Π½ΡŒ ΠΎΠΏΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° страницах ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ справочного руководства gcc. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ обсудим Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Ρ‹

, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ; ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡ… слСдуСт Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ Π² вашСм исходном ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ ΠΏΠ΅Ρ€Π΅Π΄ Π»ΡŽΠ±Ρ‹ΠΌΠΈ строками с Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²ΠΎΠΉ ΠΈΠ»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡ‚ΡŒ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС gcc. Вас ΠΌΠΎΠΆΠ΅Ρ‚ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚ΡŒ Ρ‚Π°ΠΊΠΎΠ΅ ΠΎΠ±ΠΈΠ»ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΉ для Π²Ρ‹Π±ΠΎΡ€Π° примСняСмого стандарта вмСсто простого Ρ„Π»Π°Π³Π°, Π·Π°ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ соврСмСнный стандарт. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ Π±ΠΎΠ»Π΅Π΅ старых ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ полагаСтся Π½Π° историчСски слоТившССся ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ компилятора ΠΈ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»Π°ΡΡŒ Π±Ρ‹ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ€Π°Π±ΠΎΡ‚Π° ΠΏΠΎ ΠΈΡ… обновлСнию Π² соотвСтствии с послСдними стандартами. Π Π΅Π΄ΠΊΠΎ, Ссли Π²ΠΎΠΎΠ±Ρ‰Π΅ ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ, Π²Π°ΠΌ захочСтся ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ компилятор для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ Π½Π°Ρ‡Π°Π» ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄. По ΠΌΠ΅Ρ€Π΅ измСнСния стандартов Π²Π°ΠΆΠ½ΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π²ΠΎΠΏΡ€Π΅ΠΊΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ стандарту, Π΄Π°ΠΆΠ΅ Ссли это ΠΈ Π½Π΅ самая свСТая вСрсия стандарта.

Π”Π°ΠΆΠ΅ Ссли Π²Ρ‹ ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΌΠ°Π»Π΅Π½ΡŒΠΊΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ примСнСния, ΠΊΠΎΠ³Π΄Π° соотвСтствиС стандартам, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π½Π΅ Ρ‚Π°ΠΊ ΡƒΠΆ Π²Π°ΠΆΠ½ΠΎ, часто ΠΈΠΌΠ΅Π΅Ρ‚ смысл Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ прСдупрСТдСния gcc, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ компилятор ΠΈΡΠΊΠ°Ρ‚ΡŒ ошибки Π² вашСм ΠΊΠΎΠ΄Π΅ Π΅Ρ‰Π΅ Π΄ΠΎ выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π­Ρ‚ΠΎ всСгда эффСктивнСС, Ρ‡Π΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΏΠΎ шагам ΠΊΠΎΠ΄ Π² ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ΅ ΠΈ Π½Π΅Π΄ΠΎΡƒΠΌΠ΅Π²Π°Ρ‚ΡŒ ΠΏΠΎ ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ мСста возникшСй ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. Π£ компилятора Π΅ΡΡ‚ΡŒ ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΠΏΡ†ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ простой ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ Π½Π° соотвСтствиС стандартам, Ρ‚Π°ΠΊΠΈΡ…, ΠΊΠ°ΠΊ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ удовлСтворяСт стандарту, Π½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΈΠΌΠ΅Π΅Ρ‚ ΡΠΎΠΌΠ½ΠΈΡ‚Π΅Π»ΡŒΠ½ΡƒΡŽ сСмантику. НапримСр, Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Ρ‚Π°ΠΊΠΎΠΉ порядок выполнСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ позволяСт ΠΎΠ±Ρ€Π°Ρ‰Π°Ρ‚ΡŒΡΡ ΠΊ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π΄ΠΎ Π΅Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ.

Если Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ Π½Π°ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ для ΠΊΠΎΠ»Π»Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ использования, ΠΏΡ€ΠΈ Π²Ρ‹Π±Ρ€Π°Π½Π½Ρ‹Ρ… стСпСни соотвСтствия стандарту ΠΈ Ρ‚ΠΈΠΏΠ°Ρ… ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ компилятора, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹ считаСтС достаточными, ΠΎΡ‡Π΅Π½ΡŒ Π²Π°ΠΆΠ½ΠΎ Π·Π°Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ большС усилий ΠΈ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ компиляции вашСго ΠΊΠΎΠ΄Π° Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ Π²ΠΎΠΎΠ±Ρ‰Π΅. Если Π²Ρ‹ допуститС Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ ΠΈ ΠΏΡ€ΠΈΠ²Ρ‹ΠΊΠ½ΠΈΡ‚Π΅ ΠΈΡ… ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π² ΠΎΠ΄ΠΈΠ½ прСкрасный дСнь ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Π±ΠΎΠ»Π΅Π΅ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠ΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²Ρ‹ рискуСтС ΠΏΡ€ΠΎΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ. Если ваш ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ всСгда компилируСтся Π±Π΅Π· ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ… сообщСний, Π½ΠΎΠ²ΠΎΠ΅ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π½Π΅ΠΈΠ·Π±Π΅ΠΆΠ½ΠΎ ΠΏΡ€ΠΈΠ²Π»Π΅Ρ‡Π΅Ρ‚ вашС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π±Π΅Π· ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ - полСзная ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ стоит Π²Π·ΡΡ‚ΡŒ Π½Π° Π²ΠΎΠΎΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅.

ΠžΠΏΡ†ΠΈΠΈ компилятора для отслСТивания стандартов - это самая ваТная опция, ΠΊΠ°ΡΠ°ΡŽΡ‰Π°ΡΡΡ стандартов ΠΈ Π·Π°ΡΡ‚Π°Π²Π»ΡΡŽΡ‰Π°Ρ компилятор Π΄Π΅ΠΉΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ Π² соотвСтствии со стандартом языка ISO C90. Она ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ gcc, Π½Π΅ совмСстимыС со стандартом, ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°Ρ… Π½Π° языкС Π‘ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ Π² стилС Π‘++ () ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ Ρ‚Ρ€ΠΈΠ³Ρ€Π°Ρ„ΠΎΠ² (Ρ‚Ρ€Π΅Ρ…ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚Π΅ΠΉ) ANSI. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΎΠ½Π° содСрТит макрос __, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ…, Π½Π΅ совмСстимыС со стандартом. Π’ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΡ… вСрсиях компилятора принятый стандарт ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒΡΡ. - эта опция обСспСчиваСт Π±ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ½ΠΊΠΈΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ стандарта, прСдоставляя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, Ρ‚ΠΎΡ‡Π½ΠΎ Π·Π°Π΄Π°ΡŽΡ‰ΠΈΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹ΠΉ стандарт. Π”Π°Π»Π΅Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ основныС Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹: - ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ стандарт C89; - ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ стандарта ISO, C90; - ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ стандарт C89, Π½ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ GNU ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности C99. Π’ вСрсии 4.2 gcc этот Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ примСняСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠžΠΏΡ†ΠΈΠΈ для отслСТивания стандарта Π² Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π°Ρ… define

Π‘ΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ константы (

), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒΡΡ опциями Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС ΠΈΠ»ΠΈ Π²ΠΈΠ΄Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Π² исходном тСкстС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠœΡ‹, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, считаСм, Ρ‡Ρ‚ΠΎ для Π½ΠΈΡ… ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ командная строка компилятора. - заставляСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ стандарт Π‘ ISO. ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΠ΅Ρ‚ΡΡ, ΠΊΠΎΠ³Π΄Π° Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС компилятора Π·Π°Π΄Π°Π½Π° опция . - Π°ΠΊΡ‚ΠΈΠ²ΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ стандартами IEEE Std 1003.1 ΠΈ 1003.2. ΠœΡ‹ вСрнСмся ΠΊ этим стандартам Ρ‡ΡƒΡ‚ΡŒ ΠΏΠΎΠ·ΠΆΠ΅ Π² этой Π³Π»Π°Π²Π΅. - Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ возмоТности систСм BSD. Если ΠΎΠ½ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‚ с опрСдСлСниями POSIX, опрСдСлСния BSD ΠΎΠ±Π»Π°Π΄Π°ΡŽΡ‚ Π±ΠΎΠ»Π΅Π΅ высоким ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ. - допускаСт ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ свойств ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ GNU. Если эти опрСдСлСния ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΡƒΡŽΡ‚ с опрСдСлСниями POSIX, Ρƒ послСдних Π±ΠΎΠ»Π΅Π΅ высокий ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚. ΠžΠΏΡ†ΠΈΠΈ компилятора для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ

Π­Ρ‚ΠΈ ΠΎΠΏΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ компилятору ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. И снова ΠΌΡ‹ пСрСчислим лишь основныС, ΠΏΠΎΠ»Π½Ρ‹ΠΉ список ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π² ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌ справочном руководствС gcc.

- эта Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ мощная опция ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ чистоты, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π° языкС Π‘. Помимо Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΠΏΡ†ΠΈΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° соотвСтствиС стандарту Π‘, ΠΎΠ½Π° ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½Ρ‹Π΅ конструкции языка Π‘, Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Π½Ρ‹Π΅ стандартом, ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ нСдопустимыми всС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ GNU ΠΏΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡŽ ΠΊ стандарту. Π­Ρ‚Ρƒ ΠΎΠΏΡ†ΠΈΡŽ слСдуСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ максимальной пСрСносимости вашСго ΠΊΠΎΠ΄Π° Π½Π° Π‘. НСдостаток Π΅Π΅ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ компилятор сильно ΠΎΠ·Π°Π±ΠΎΡ‡Π΅Π½ чистотой вашСго ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΈ ΠΏΠΎΡ€ΠΎΠΉ приходится ΠΏΠΎΠ»ΠΎΠΌΠ°Ρ‚ΡŒ Π³ΠΎΠ»ΠΎΠ²Ρƒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·Π΄Π΅Π»Π°Ρ‚ΡŒΡΡ с нСсколькими ΠΎΡΡ‚Π°Π²ΡˆΠΈΠΌΠΈΡΡ прСдупрСТдСниями. - провСряСт ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ Ρ‚ΠΈΠΏΠΎΠ² Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ сСмСйства . - провСряСт Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ скобок, Π΄Π°ΠΆΠ΅ Ρ‚Π°ΠΌ, Π³Π΄Π΅ ΠΎΠ½ΠΈ Π½Π΅ Π½ΡƒΠΆΠ½Ρ‹. Π­Ρ‚Π° опция ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ»Π΅Π·Π½Π° для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ слоТныС структуры ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Π·Π°Π΄ΡƒΠΌΠ°Π½ΠΎ. - провСряСт Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€Π°Ρ… , Ρ‡Ρ‚ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ считаСтся Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΌ стилСм программирования. - провСряСт Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·Π½Ρ‹Π΅ случаи, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, статичСскиС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅, Π½ΠΎ Π½Π΅ описанныС, Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, ΠΎΡ‚Π±Ρ€ΠΎΡˆΠ΅Π½Π½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹. - Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Ρ‚ΠΈΠΏΠΎΠ² ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ gcc, Π² Ρ‚ΠΎΠΌ числС всС ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ ΠΎΠΏΡ†ΠΈΠΈ - (Π½Π΅ охватываСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ). Π‘ Π΅Π΅ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π»Π΅Π³ΠΊΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ чистоты ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°.
ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

БущСствуСт Π΅Ρ‰Π΅ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎΠ΅ мноТСство Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ, всС подробности см. Π½Π° Web-страницах gcc. Π’ основном ΠΌΡ‹ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΠ΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ

; это ΡƒΠ΄Π°Ρ‡Π½Ρ‹ΠΉ компромисс ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΎΠΉ, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ высокого качСства, ΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒΡŽ Π²Ρ‹Π²ΠΎΠ΄Π° компилятором массы Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ становится Ρ‚Ρ€ΡƒΠ΄Π½ΠΎ свСсти ΠΊ Π½ΡƒΠ»ΡŽ.

Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡΡ‹ ΠΈ Linux Standards Base

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ собираСмся ΠΏΠΎΠ΄Π½ΡΡ‚ΡŒΡΡ Π½Π° ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π²Ρ‹ΡˆΠ΅ ΠΈ ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΎΡ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π½Π° языкС Π‘ ΠΊ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ интСрфСйсов (систСмных Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ), прСдоставляСмых ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой. Π£ этого уровня стандартизации Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π½Ρ‹Π΅ ΡΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅: Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, прСдоставляСмыС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ, ΠΈ систСмныС Π²Ρ‹Π·ΠΎΠ²Ρ‹, Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой Π½Π° Π½ΠΈΠ·ΠΊΠΎΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅. И Ρƒ Ρ‚Π΅Ρ…, ΠΈ Ρƒ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π΅ΡΡ‚ΡŒ Π΄Π²Π° уровня Π΄Π΅Ρ‚Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ: ΠΊΠ°ΠΊΠΈΠ΅ интСрфСйсы прСдставлСны ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ интСрфСйс.

ΠžΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΠΉ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚ Π² этой области для ОБ Linux - Linux Standards Base (LSB, стандарты ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм Π½Π° Π±Π°Π·Π΅ Linux), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° Web-сайтах http://mvw.linuxbase.org ΠΈΠ»ΠΈ http://www.linux-foundation.org/en/LSB . Π£ΠΆΠ΅ Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½ΠΎ нСсколько вСрсий стандартов, ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° продолТаСтся.

Бписок дистрибутивов, ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠΈΡ… ΡΠ΅Ρ€Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ, ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎ адрСсу http://www.linux-foundation.org/en/Products . Π‘Π΅Ρ€Ρ‚ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии Red Hat, SUSE ΠΈ Ubuntu, Π½ΠΎ ΠΏΠΎΠΌΠ½ΠΈΡ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ послС выпуска дистрибутива Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° сСртификации Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ врСмя. На Web-сайтС Π΅ΡΡ‚ΡŒ список дистрибутивов, проходящих тСстированиС ΠΈΠ»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½ΡƒΠΆΠ΄Π°ΡŽΡ‰ΠΈΡ…ΡΡ Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… обновлСниях для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΎΠΉΡ‚ΠΈ сСртификационныС испытания.

Π’ стандартС Linux Standards Base (Ρ‡Ρ‚ΠΎ касаСтся вСрсии 3.1) ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Ρ‚Ρ€ΠΈ области для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π° соотвСтствиС:

β–‘ ядро - основныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΈ мСстонахоТдСниС ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы;

β–‘ Π‘++ - Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π‘++;

β–‘ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ стол - Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ для установок Ρ€Π°Π±ΠΎΡ‡Π΅Π³ΠΎ стола, Π² основном Ρ€Π°Π·Π½Ρ‹Π΅ графичСскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

Π’ спСцификации нас интСрСсуСт большС всСго ядро.

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ LSB ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ряд областСй Π² собствСнной Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ, Π½ΠΎ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Ρ… интСрфСйсов Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ссылки Π½Π° внСшниС стандарты. Π’ стандартС описаны ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ области:

β–‘ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² для Π΄Π²ΠΎΠΈΡ‡Π½ΠΎΠΉ совмСстимости;

β–‘ стандарты динамичСского связывания;

β–‘ стандартныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹Π΅, Ρ‚Π°ΠΊ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ X Window System;

β–‘ командная ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π΅ΠΆΠΈΠΌΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки;

β–‘ срСда исполнСния, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹;

β–‘ инициализация систСмы ΠΈ ΡƒΡ€ΠΎΠ²Π½ΠΈ запуска (run levels).

Π’ этой Π³Π»Π°Π²Π΅ ΠΌΡ‹ обсудим Ρ‚ΠΎΠ»ΡŒΠΊΠΎ стандартныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ систСмы.

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ LSB

ДокумСнтация Linux Standard Base опрСдСляСт двумя способами интСрфСйсы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ. Для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π² основном Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Π‘ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° GNU ΠΈΠ»ΠΈ склонных Π±Ρ‹Ρ‚ΡŒ стандартами Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Linux, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ ΠΈ интСрфСйс, ΠΈ Π΅Π³ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅. Для Π΄Ρ€ΡƒΠ³ΠΈΡ… интСрфСйсов, Π² особСнности с UNIX-ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ основой, стандарт просто констатируСт, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠΉ интСрфСйс Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ вСсти сСбя, ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌ стандартом, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Common Application Environment (CAE, общая прикладная срСда) ΠΈΠ»ΠΈ Π΅Ρ‰Π΅ Ρ‡Π°Ρ‰Π΅ Single UNIX Specification (Сдиная спСцификация UNIX), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅ΡΡ‚ΡŒ Π½Π° Web-сайтС Open Group http://www.opengroup.org . НСкоторыС части ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ (Π² настоящСС врСмя трСбуСтся рСгистрация) ΠΏΠΎ адрСсу http://www.unix.org/online.html .

К соТалСнию, Ρƒ Π»Π΅ΠΆΠ°Ρ‰ΠΈΡ… Π² основС стандартов для ОБ Linux ΠΈ UNIX-стандартов довольно Π·Π°ΠΏΡƒΡ‚Π°Π½Π½ΠΎΠ΅ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ΅, ΠΈ сущСствуСт слишком ΡˆΠΈΡ€ΠΎΠΊΠΈΠΉ Π²Ρ‹Π±ΠΎΡ€, хотя Π² основном Ρ€Π°Π·Π½Ρ‹Π΅ вСрсии ΠΏΠΎΡ‡Ρ‚ΠΈ совмСстимы.

ΠšΡ€Π°Ρ‚ΠΊΠΈΠΉ ΡƒΡ€ΠΎΠΊ истории

ОБ UNIX Ρ€ΠΎΠ΄ΠΈΠ»Π°ΡΡŒ Π² ΠΊΠΎΠ½Ρ†Π΅ 1960 Π³Π³. Π² ΠΏΠΎΠ΄Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠΈ Bell Laboratories ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ AT&T, ΠΊΠΎΠ³Π΄Π° КСн Вомпсон (Ken Thompson) ΠΈ ДСннис Π ΠΈΡ‚Ρ‡ΠΈ (Dennis Ritchie) написали ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΡƒΡŽ систСму, ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΡƒΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ пользования, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°Π·Π²Π°Π»ΠΈ Unics. Каким-Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ имя измСнилось Π½Π° UNIX. AT&T Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΠ»Π° унивСрситСтам Π±Ρ€Π°Ρ‚ΡŒ исходный ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄ для собствСнных Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΎΠΊ, ΠΈ систСма UNIX быстро стала нСвСроятно популярной благодаря ΠΎΡ‡Π΅Π½ΡŒ Ρ‡Π΅Ρ‚ΠΊΠΎΠΉ логичСской структурС ΠΈ ΠΌΠΎΡ‰Π½Ρ‹ΠΌ идСям. НаличиС исходного ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π° Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΡ‚Π°Ρ‚ΡŒ сущСствСнным стимулом, Ρ‚. ΠΊ. позволяло программистам Π²Π½ΠΎΡΠΈΡ‚ΡŒ измСнСния ΠΈ ΡΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ.

ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ систСма BSD Π±Ρ‹Π»Π° Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ появился благодаря Ρ€Π°Π±ΠΎΡ‚Π΅, ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π½Π½ΠΎΠΉ Π² УнивСрситСтС ΠšΠ°Π»ΠΈΡ„ΠΎΡ€Π½ΠΈΠΈ Π² Π‘Π΅Ρ€ΠΊΠ»ΠΈ, ΠΈ ΡƒΠ΄Π΅Π»ΠΈΠ²ΡˆΠ΅ΠΉ ΠΌΠ½ΠΎΠ³ΠΎ внимания ΠΎΡ€Π³Π°Π½ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ сСти.

Когда компания AT&T Π½Π°Ρ‡Π°Π»Π° ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ UNIX Π² ΠΊΠΎΠΌΠΌΠ΅Ρ€Ρ‡Π΅ΡΠΊΡƒΡŽ систСму, Ρ‡Ρ‚ΠΎ происходило Π³Π»Π°Π²Π½Ρ‹ΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π² сСрСдинС 1980 Π³Π³., ΠΎΠ½Π° Π½Π°Π·Ρ‹Π²Π°Π»Π° выпуски систСмы UNIX System, ΠΈ самым популярным Π±Ρ‹Π» UNIX System V.

Появилось ΠΌΠ½ΠΎΠ³ΠΎ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ², слишком ΠΌΠ½ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ ΠΈΡ… здСсь, всС ΠΎΠ½ΠΈ ΠΈΠΌΠ΅Π»ΠΈ нСбольшиС отличия ΠΎΡ‚ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… стандартов ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ дополнСния, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ ΠΏΡ‹Ρ‚Π°Π»ΠΈΡΡŒ ΠΏΠΎΠ²Ρ‹ΡΠΈΡ‚ΡŒ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°, создавая собствСнныС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ.

ВсС ΠΏΠΎ-настоящСму ΡƒΡΠ»ΠΎΠΆΠ½ΠΈΠ»ΠΎΡΡŒ, ΠΊΠΎΠ³Π΄Π° AT&T ΠΏΡ€ΠΎΠ΄Π°Π»Π° UNIX-бизнСс ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Novell, которая Π² 1994 Π³. Ρ€Π΅ΡˆΠΈΠ»Π° Π΅Π³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ, ΠΈ Π²Π»Π°Π΄Π΅Π½ΠΈΠ΅ ΠΏΡ€Π°Π²Π°ΠΌΠΈ ΠΈ Ρ‚ΠΎΡ€Π³ΠΎΠ²Ρ‹ΠΌΠΈ ΠΌΠ°Ρ€ΠΊΠ°ΠΌΠΈ стало Ρ‡Π΅ΠΌ-Ρ‚ΠΎ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΌ, ΠΏΠΎΡΠ»ΡƒΠΆΠΈΠ²ΡˆΠΈΠΌ ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ΠΎΠΌ Ρ€Π°Π·Π½Ρ‹Ρ… судСбных Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π².

Π’ 1988 Π³. IEEE (Institute of Electrical and Electronic Engineers, Π˜Π½ΡΡ‚ΠΈΡ‚ΡƒΡ‚ ΠΈΠ½ΠΆΠ΅Π½Π΅Ρ€ΠΎΠ² ΠΏΠΎ элСктротСхникС ΠΈ радиоэлСктроникС, http://www.ieee.org ) выпустил ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ стандартов: POSIX ΠΈΠ»ΠΈ IEEE 1003 - стандартов, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Π»ΠΈΡΡŒ ΠΊΠ°ΠΊ ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰Π°Ρ спСцификация пСрСносимого интСрфСйса ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм. НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ это Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ ΠΈ Ρ‡Π΅Ρ‚ΠΊΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹ΠΉ стандарт, POSIX - Ρ‚Π°ΠΊΠΆΠ΅ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΎΠΌ лишь спСцификация ядра с ΠΎΡ‡Π΅Π½ΡŒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ примСнСния.

Π’ 1994 Π³. X/Open Company, Π½Π΅ ΡƒΡ‡Π°ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Π² поставках организация, выпустила Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€ спСцификаций, X/Open CAE ΠΈΠ»ΠΈ Common Applications Environment (общая прикладная срСда), ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ собой Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ стандартов IEEE POSIX ΠΈ Ρ„ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹ΠΉ ΠΈΠΌ Π²ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… областях. Компания X/Open ΠΏΠΎΠ·ΠΆΠ΅ объСдинилась с OSF (Free Software Foundation, Ρ„ΠΎΠ½Π΄ свободного ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния) для учрСТдСния Open Group; Π΅Π΅ исходная Web-страница находится ΠΏΠΎ адрСсу http://www.opengroup.org/ . Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ CAE Π±Ρ‹Π» исправлСн ΠΈ Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½ Π² 2002 Π³. ΠΊΠ°ΠΊ Single UNIX Specification, Version 3 (Сдиная спСцификация UNIX, вСрсия 3), Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ Open Group.

ИмСнно Π½Π° эту ΡΠΏΠ΅Ρ†ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΡŽ Ρ‡Π°Ρ‰Π΅ всСго ссылаСтся Π±Π°Π·Π° стандартов Linux.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Π‘Π»Π΅Π΄ΡƒΠ΅Ρ‚ ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ "Linux" - это торговая ΠΌΠ°Ρ€ΠΊΠ°, принадлСТащая Линусу Π’ΠΎΡ€Π²Π°Π»ΡŒΠ΄ΡΡƒ (Linus Torvalds). Π‘ΠΌ. http://www.linuxmark.org/ .

ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ стандарта LSB ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ

Π”ΠΎΠ²ΠΎΠ»ΡŒΠ½ΠΎ ΠΎΠ± истории создания стандартов. Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ для людСй, ΠΏΠΈΡˆΡƒΡ‰ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° языкС Π‘ (ΠΈΠ»ΠΈ Π‘++), Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈΡ… пСрСносимости?

Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Π²Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ Π²Π°ΠΌΠΈ библиотСчная функция ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Π² стандартС LSB. Если Π΅Π΅ Ρ‚Π°ΠΌ Π½Π΅Ρ‚, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π²Ρ‹ Π΄Π΅Π»Π°Π΅Ρ‚Π΅ Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π΅Π»Π΅Π³ΠΊΠΎ Π±ΡƒΠ΄Π΅Ρ‚ пСрСнСсти Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ систСму, ΠΈ Π²Π°ΠΌ слСдуСт ΠΏΠΎΠΈΡΠΊΠ°Ρ‚ΡŒ стандартный способ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Ρ‚ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²Ρ‹ ΠΏΡ‹Ρ‚Π°Π΅Ρ‚Π΅ΡΡŒ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ. Π‘Ρ‹Ρ‚ΡŒ ΠΌΠΎΠΆΠ΅Ρ‚, стоит ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Linux apropos, которая ΠΈΡ‰Π΅Ρ‚ страницы ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ справочного руководства для ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ссылок.

Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Ρ‡Ρ‚ΠΎ Ρ‚Ρ€ΡƒΠ΄Π½Π΅Π΅, слСдуСт ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π²Π°ΠΌΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ Π² стандарт, ΠΈ Π²Ρ‹ Π½Π΅ ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚Π΅ΡΡŒ Π½Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅, Π½Π΅ описанноС Π² стандартС. Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, для этого Π²Π°ΠΌ придСтся ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ стандарту Single UNIX Specification, Ссли ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΎ Π² стандартС LSB. ΠžΡ‡Π΅Π½ΡŒ Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ способ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π½Π΅ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎΠ³ΠΎ повСдСния - ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΌΡƒ руководству Linux. На ΠΌΠ½ΠΎΠ³ΠΈΡ… Π΅Π³ΠΎ страницах Π΅ΡΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π» "BUGS" ("Ошибки"), ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ собой Π½Π΅ΠΎΡ†Π΅Π½ΠΈΠΌΡ‹ΠΉ источник ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ Ρ‚ΠΎΠΌ, Π³Π΄Π΅ Π² ОБ Linux ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ Π²Ρ‹Π·ΠΎΠ² Π½Π΅ Π² ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΌΠ΅Ρ€Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ стандарты ΠΈΠ»ΠΈ Π³Π΄Π΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π΅Ρ„Π΅ΠΊΡ‚Ρ‹ ΠΈ нСлСпости Π² ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠΈ.

ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΈ Π³Ρ€ΡƒΠΏΠΏΡ‹ LSB

Π­Ρ‚ΠΎΡ‚ Ρ€Π°Π·Π΄Π΅Π» стандарта Ρ‚ΠΎΡ‡Π΅Π½, ΠΊΡ€Π°Ρ‚ΠΎΠΊ ΠΈ понятСн. Π”Π°Π»Π΅Π΅ пСрСчислСны Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ трСбования стандарта.

β–‘ БпСцификация Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ для получСния ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹Ρ… свСдСний ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ Ρ‚Π°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠ°ΠΊ /etc/passwd, Π° всСгда ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π²Ρ‹Π·ΠΎΠ²Ρ‹ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€

, ΠΈΠ»ΠΈ стандартныС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ .

β–‘ Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ наличия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с ΠΈΠΌΠ΅Π½Π΅ΠΌ root Π² Π³Ρ€ΡƒΠΏΠΏΠ΅ root, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся администратором систСмы с ΠΏΠΎΠ»Π½Ρ‹ΠΌ Π½Π°Π±ΠΎΡ€ΠΎΠΌ ΠΏΡ€ΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΠΉ ΠΈΠ»ΠΈ ΠΏΡ€Π°Π² доступа. ΠœΡ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π°Ρ…ΠΎΠ΄ΠΈΠΌ Π² стандартС ряд Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠΌΠ΅Π½ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ Π³Ρ€ΡƒΠΏΠΏ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ слСдуСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒ Π² стандартных прилоТСниях; ΠΎΠ½ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для использования дистрибутивами.

β–‘ Π’ стандартС Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, Ρ‡Ρ‚ΠΎ ID, мСньшиС 100, - систСмныС ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Π΅ записи, Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ 100-499 Π·Π°Π½ΠΈΠΌΠ°ΡŽΡ‚ систСмныС администраторы ΠΈ постустановочныС сцСнарии, ΠΈ, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, ID с Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ 500 ΠΈ большими ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для ΡƒΡ‡Π΅Ρ‚Π½Ρ‹Ρ… записСй ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ программистов Linux Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π·Π½Π°Ρ‚ΡŒ ΠΎ трСбованиях стандартов, ΠΊΠ°ΡΠ°ΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ систСмы LSB

ΠžΠ±Π»Π°ΡΡ‚ΡŒ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ»ΠΈ запуска систСмы всСгда, ΠΏΠΎ ΠΊΡ€Π°ΠΉΠ½Π΅ΠΉ ΠΌΠ΅Ρ€Π΅ для нас, Π±Ρ‹Π»Π° источником бСспокойства ΠΈΠ·-Π·Π° Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΡƒΠ»ΠΎΠ²ΠΈΠΌΡ‹Ρ… Ρ€Π°Π·Π»ΠΈΡ‡ΠΈΠΉ дистрибутивов.

БистСма Linux унаслСдовала ΠΎΡ‚ UNIX-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм идСю ΡƒΡ€ΠΎΠ²Π½Π΅ΠΉ запуска ΠΈΠ»ΠΈ выполнСния, ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‰ΠΈΡ… сСрвисы, постоянно Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΠ΅ΡΡ Π² систСмС. Π’ Ρ‚Π°Π±Π». 18.1 ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ стандартныС опрСдСлСния для ОБ Linux.


Π’Π°Π±Π»ΠΈΡ†Π° 18.1

Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ запуска ОписаниС
0 Halt. ΠŸΡ€ΠΈΠΌΠ΅Π½ΡΠ΅Ρ‚ΡΡ ΠΊΠ°ΠΊ логичСскоС состояниС, ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ слСдуСт ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΏΡ€ΠΈ остановкС систСмы
1 ΠžΠ΄Π½ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ. ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, ΠΎΡ‚Π»ΠΈΡ‡Π°ΡŽΡ‰ΠΈΠ΅ΡΡ ΠΎΡ‚ / (ΠΊΠΎΡ€Π½Π΅Π²ΠΎΠΉ), ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ, ΠΈ сСтСвой ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ примСняСтся для обслуТивания систСмы
2 ΠœΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ, Π½ΠΎ Π±Π΅Π· сСтСвой ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ
3 ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ с сСтСвой ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ экран рСгистрации Π² тСкстовом Ρ€Π΅ΠΆΠΈΠΌΠ΅
4 Π—Π°Ρ€Π΅Π·Π΅Ρ€Π²ΠΈΡ€ΠΎΠ²Π°Π½
5 ΠžΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Ρ€Π΅ΠΆΠΈΠΌ с сСтСвой ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ экран рСгистрации Π² графичСском Ρ€Π΅ΠΆΠΈΠΌΠ΅
6 ΠŸΡΠ΅Π²Π΄ΠΎΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ, примСняСмый для ΠΏΠ΅Ρ€Π΅Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ LSB ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ эти ΡƒΡ€ΠΎΠ²Π½ΠΈ, Π½ΠΎ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΈΡ… ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ использования, хотя ΠΎΠ½ΠΈ ΠΈ ΠΎΡ‡Π΅Π½ΡŒ распространСны.

Π‘ΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Π΅Ρ‚ ΡƒΡ€ΠΎΠ²Π½ΠΈ запуска Π½Π°Π±ΠΎΡ€ сцСнариСв ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, примСняСмых для запуска, останова ΠΈ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ запуска сСрвисов. Π’ ΠΏΡ€ΠΎΡˆΠ»ΠΎΠΌ ΠΎΠ½ΠΈ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡΡŒ Π² Ρ€Π°Π·Π½Ρ‹Ρ… мСстах Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ /etc, часто Π² /etc/init.d ΠΈΠ»ΠΈ Π² /etc/rc.d/init.d. ПодобноС Ρ€Π°Π·Π½ΠΎΠΎΠ±Ρ€Π°Π·ΠΈΠ΅ часто Π±Ρ‹Π»ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½ΠΎΠΉ ΠΏΡƒΡ‚Π°Π½ΠΈΡ†Ρ‹, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, мСнявшиС дистрибутивы, Π½Π΅ ΠΌΠΎΠ³Π»ΠΈ Π½Π°ΠΉΡ‚ΠΈ сцСнарии ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹Ρ… мСстах, ΠΈ установка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π»Π°ΡΡŒ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сцСнарий ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΈΠ· Π½Π΅Π²Π΅Ρ€Π½ΠΎΠ³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ LSB 3.1 опрСдСляСт ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /etc/init.d, ΠΊΠ°ΠΊ мСсто хранСния сцСнариСв ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Π½ΠΎ ΠΏΡ€ΠΈ этом Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ этому ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ Π±Ρ‹Ρ‚ΡŒ ссылкой Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠ΅ мСсто Π² систСмС.

Π£ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ сцСнария Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ /etc/init.d Π΅ΡΡ‚ΡŒ имя, связанноС с прСдоставляСмым ΠΈΠΌ сСрвисом. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС сСрвисы ОБ Linux Π΄ΠΎΠ»ΠΆΠ½Ρ‹ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄Π½ΠΎ пространство ΠΈΠΌΠ΅Π½, Π²Π°ΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ эти ΠΈΠΌΠ΅Π½Π° Π±Ρ‹Π»ΠΈ ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹. НапримСр, Тизнь Π±ΡƒΠ΄Π΅Ρ‚ нСсладкой, Ссли сСрвисы MySQL ΠΈ PostgreSQL Ρ€Π΅ΡˆΠ°Ρ‚ Π½Π°Π·Π²Π°Ρ‚ΡŒ свои сцСнарии "database". Для устранСния Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π° сущСствуСт Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ Π½Π°Π±ΠΎΡ€ стандартов. Π­Ρ‚ΠΎ стандарт Assigned Names And Numbers Authority (LANANА, ΠΎΡ€Π³Π°Π½ назначСния ΠΈΠΌΠ΅Π½ ΠΈ Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² Π² Linux), ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ Π½Π° Web-сайтС http://www.lanana.org/ . К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ, Π²Π°ΠΌ понадобится Π·Π½Π°Ρ‚ΡŒ ΠΎΡ‡Π΅Π½ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎΠ΅ ΠΎΠ± этом стандартС, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π² Π½Π΅ΠΌ хранится список зарСгистрированных ΠΈΠΌΠ΅Π½ сцСнариСв ΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ², ΠΎΠ±Π»Π΅Π³Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Тизнь ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΠΌ систСм Linux.


Π‘Ρ†Π΅Π½Π°Ρ€ΠΈΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ Π΅Π³ΠΎ дСйствиями. Π’ стандартС ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, пСрСчислСнныС Π² Ρ‚Π°Π±Π». 18.2.


Π’Π°Π±Π»ΠΈΡ†Π° 18.2

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
ЗапускаСт (ΠΈΠ»ΠΈ пСрСзапускаСт) сСрвис
ΠžΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ сСрвис
ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΠΊΠ°Π΅Ρ‚ сСрвис; ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΠΊΠ°ΠΊ простой останов сСрвиса, Π·Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ слСдуСт запуск этого сСрвиса
ΠŸΠ΅Ρ€Π΅ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Π΅Ρ‚ сСрвис, ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ загруТая ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ Π±Π΅Π· Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ остановки сСрвиса. Π­Ρ‚ΠΎΡ‚ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Π½Π΅ всС сСрвисы, поэтому Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ нСдоступСн Π² Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… сцСнариях, Π° Ссли доступСн, Ρ‚ΠΎ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ эффСкта
ΠŸΡ‹Ρ‚Π°Π΅Ρ‚ΡΡ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ пСрСустановку, Ссли сСрвис Π΅Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚, Ссли Π½Π΅Ρ‚ - выполняСт пСрСзапуск сСрвиса
Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ тСкстовоС сообщСниС ΠΎ состоянии сСрвиса ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΊΠΎΠ΄ состояния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ для опрСдСлСния состояния сСрвиса

ВсС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ 0 Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΈΠ»ΠΈ ΠΊΠΎΠ΄ ошибки, ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠ³ΠΎ исхода. Π’ случаС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°

возвращаСтся 0, Ссли сСрвис выполняСтся; всС ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹ ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‚, Ρ‡Ρ‚ΠΎ сСрвис Π½Π΅ Π·Π°ΠΏΡƒΡ‰Π΅Π½ ΠΏΠΎ ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅.

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚ устройства Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы

ПослСдний стандарт, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ собираСмся, Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π² этой Π³Π»Π°Π²Π΅, - Filesystem Hierarchy Standard (FHS, стандарт ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы). Π•Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΏΠΎ адрСсу http://www.pathname.com/fhs/ .

НазначСниС этого стандарта - ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ‚ΠΈΠΏΠΎΠ²Ρ‹Ρ… мСст хранСния Π² Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмС Linux для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠ°ΠΊ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ, Ρ‚Π°ΠΊ ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΌΠΎΠ³Π»ΠΈ Π΄Π΅Π»Π°Ρ‚ΡŒ обоснованныС прСдполоТСния ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ мСстонахоТдСния Ρ‚Π΅Ρ… ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². ΠœΠ½ΠΎΠ³ΠΎΠ»Π΅Ρ‚Π½ΠΈΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ UNIX-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм Π΄ΠΎΠ»Π³ΠΎΠ΅ врСмя Таловались Π½Π° Ρ‚Ρ€ΡƒΠ΄Π½ΠΎΡƒΠ»ΠΎΠ²ΠΈΠΌΡ‹Π΅ различия Π² схСмах располоТСния Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… систСм, ΠΈ стандарт FHS ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ дистрибутивам Linux способ ΠΈΠ·Π±Π΅ΠΆΠ°Ρ‚ΡŒ повторСния этого прСрывистого ΠΏΡƒΡ‚ΠΈ.

Π‘Ρ…Π΅ΠΌΠ° размСщСния Ρ„Π°ΠΉΠ»ΠΎΠ² Π² систСмС Linux Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»ΡƒΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠΉ структурой Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², основанной Π½Π° историчСски ΡΠ»ΠΎΠΆΠΈΠ²ΡˆΠΈΡ…ΡΡ прСдставлСниях. ΠžΡ‚Ρ‡Π°ΡΡ‚ΠΈ это ΠΏΡ€Π°Π²Π΄Π°, Π½ΠΎ с Π³ΠΎΠ΄Π°ΠΌΠΈ схСма размСщСния Π½Π΅Π±Π΅Π·ΠΎΡΠ½ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ²ΠΎΠ»ΡŽΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Π»Π° Π² ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ сСгодня. Основная Π΅Π΅ идСя - Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² Π½Π° Ρ‚Ρ€ΠΈ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π³Ρ€ΡƒΠΏΠΏΡ‹:

β–‘ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, ΡƒΠ½ΠΈΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ систСмы Linux, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ сцСнарии запуска ΠΈ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ;

β–‘ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ нСсколькими Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΌΠΈ систСмами Linux, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ;

β–‘ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ для чтСния/записи, Π½ΠΎ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰ΠΈΠΌΠΈ систСмами Linux ΠΈΠ»ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΌΠΈ систСмами, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ исходныС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ.

Π’ этой ΠΊΠ½ΠΈΠ³Π΅ нас Π½Π΅ слишком интСрСсуСт совмСстноС использованиС Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ вСрсиями Linux, хотя, Π² случаС сСти ΠΈΠ· машин с ОБ Linux, это ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΉ способ ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ сущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Π° копия ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΈ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π΅ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… ΠΌΠ°ΡˆΠΈΠ½Π°Ρ… Π² сСти. Π­Ρ‚ΠΎ особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для бСздисковых Ρ€Π°Π±ΠΎΡ‡ΠΈΡ… станций.

Π’ стандартС FHS ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° структура Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня, ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ ряд ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΈ нСсколько Π½Π΅ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²; основныС ΠΈΠ· Π½ΠΈΡ… ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Ρ‹ Π² Ρ‚Π°Π±Π». 18.3.


Π’Π°Π±Π»ΠΈΡ†Π° 18.3

ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ ΠžΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ? НазначСниС
/bin Π”Π° Π’Π°ΠΆΠ½Ρ‹Π΅ систСмныС Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹
/boot Π”Π° Π€Π°ΠΉΠ»Ρ‹, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ систСмы
/dev Π”Π° Устройства
/etc Π”Π° БистСмныС Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ
/home НСт ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ для Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ
/lib Π”Π° Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ
/media Π”Π° ΠœΠ΅ΡΡ‚ΠΎ для ΡΡŠΠ΅ΠΌΠ½Ρ‹Ρ… ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… носитСлСй с ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ° носитСлСй, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ систСмой
/mnt Π”Π° Удобная Ρ‚ΠΎΡ‡ΠΊΠ° для Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… устройств, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ CD-ROM ΠΈ Π½Π°ΠΊΠΎΠΏΠΈΡ‚Π΅Π»ΠΈ Ρ„Π»ΡΡˆ-памяти
/opt Π”Π° Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС
/root НСт Π€Π°ΠΉΠ»Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ root
/sbin Π”Π° Π’Π°ΠΆΠ½Ρ‹Π΅ систСмныС Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ Π² процСссС запуска систСмы
/srv Π”Π° ΠŸΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния Π΄Π°Π½Π½Ρ‹Π΅ для сСрвисов, прСдоставляСмых Π΄Π°Π½Π½ΠΎΠΉ систСмой
/tmp Π”Π° Π’Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹
/usr Π”Π° Π’ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ иСрархия. Π’Ρ€Π°Π΄ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ хранятся здСсь, Π½ΠΎ Π² наши Π΄Π½ΠΈ это считаСтся Π΄ΡƒΡ€Π½Ρ‹ΠΌ стилСм ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π΅ слСдуСт ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ ΠΏΡ€Π°Π²ΠΎ записи Π² этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³
/var Π”Π° ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Ρ‹ рСгистрации

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΠΌΠΎΠ³ΡƒΡ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠ΅ΡΡ с lib, хотя это ΠΈ Π½Π΅ распространСно. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Π²Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ Π±ΡƒΠ΄Π΅Ρ‚Π΅ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /lost+found (для восстановлСния Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмы с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ fsck) ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /proc, ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ собой ΠΏΡΠ΅Π²Π΄ΠΎΡ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму, ΠΎΠ±Π΅ΡΠΏΠ΅Ρ‡ΠΈΠ²Π°ΡŽΡ‰ΡƒΡŽ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‰Π΅ΠΉ систСмы. ВСкущая вСрсия стандарта FHS усилСнно ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ„Π°ΠΉΠ»ΠΎΠ²ΡƒΡŽ систСму /proc, Π½ΠΎ Π΅Π΅ присутствиС Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΡΡ‚ΠΈ, ΠΊΠ°ΡΠ°ΡŽΡ‰ΠΈΠ΅ΡΡ систСмы /proc, Π² основном выходят Π·Π° Ρ€Π°ΠΌΠΊΠΈ Ρ‚Π΅ΠΌ, обсуТдаСмых Π² этой ΠΊΠ½ΠΈΠ³Π΅, хотя ΠΌΡ‹ ΠΈ ΠΏΡ€ΠΈΠ²Π΅Π»ΠΈ Π΅Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΈΠΉ ΠΎΠ±Π·ΠΎΡ€ Π² Π³Π»Π°Π²Π΅ 3.

β–‘ /bin - содСрТит Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ root, Ρ‚Π°ΠΊ ΠΈ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Π°ΠΆΠ½Ρ‹ для функционирования Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅, ΠΊΠΎΠ³Π΄Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ структуры ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΌΠΎΠ³ΡƒΡ‚ Π½Π΅ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ. НапримСр, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ здСсь ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ядра

ΠΈ , ΠΊΠ°ΠΊ ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ .

β–‘ /boot - примСняСтся для Ρ„Π°ΠΉΠ»ΠΎΠ², Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… Π²ΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ систСмы Linux. Часто этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π», ΠΌΠ΅Π½Π΅Π΅ 10 ΠœΠ±Π°ΠΉΡ‚, ΠΈ часто это ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·Π΄Π΅Π». Π­Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π² систСмах Π½Π° Π±Π°Π·Π΅ PC, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π΅ΡΡ‚ΡŒ ограничСния BIOS для Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠ³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΏΠ΅Ρ€Π²Ρ‹Ρ… 2 ΠΈΠ»ΠΈ 4 Π“Π±Π°ΠΉΡ‚ диска. ИмСя этот ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π² Π²ΠΈΠ΄Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π°Π·Π΄Π΅Π»Π°, Π²Ρ‹ Π±ΡƒΠ΄Π΅Ρ‚Π΅ ΠΎΠ±Π»Π°Π΄Π°Ρ‚ΡŒ большСй Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΈ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠΈ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Ρ… Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ² диска.

β–‘ /dev - содСрТит ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ устройств, ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅ΠΌΡ‹Π΅ Π½Π° Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Π΅ устройства. НапримСр, /dev/had Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ диск IDE.

β–‘ /etc - содСрТит Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ. По Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΈ здСсь ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ ΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, Π½ΠΎ это ΡƒΠΆΠ΅ Π½Π΅ соотвСтствуСт Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° соврСмСнных систСм Linux. Π‘Π°ΠΌΡ‹ΠΉ извСстный Ρ„Π°ΠΉΠ» Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ /etc - это, вСроятно, Ρ„Π°ΠΉΠ» passwd, содСрТащий ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡΡ…. Π”Ρ€ΡƒΠ³ΠΈΠ΅ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ - fstab с ΠΏΠ΅Ρ€Π΅Ρ‡Π½Π΅ΠΌ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ² монтирования; hosts со списком ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ IP-адрСсов Π² ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€ΠΎΠ², ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ httpd, содСрТащий ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡŽ для сСрвСра Apache.

β–‘ /home - ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ для Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π² этом ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ с ΠΈΠΌΠ΅Π½Π΅ΠΌ, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΌ с рСгистрационным ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, ΠΈ ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ рСгистрационным ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. НапримСр, послС рСгистрации ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ rick ΠΏΠΎΡ‡Ρ‚ΠΈ навСрняка ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ сСбя Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ /home/rick.

β–‘ /lib - содСрТит Π²Π°ΠΆΠ½Ρ‹Π΅ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ядра, особСнно Ρ‚Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ΡΡ Π²ΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ систСмы Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅.

β–‘ /media - Π·Π°Π΄ΡƒΠΌΠ°Π½ ΠΊΠ°ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня для хранСния ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ²-Ρ‚ΠΎΡ‡Π΅ΠΊ монтирования для ΡΡŠΠ΅ΠΌΠ½Ρ‹Ρ… носитСлСй. ЦСль - ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡƒΠ΄Π°Π»ΡΡ‚ΡŒ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ /cdrom ΠΈ /floppy.

β–‘ /mnt - просто ΡƒΠ΄ΠΎΠ±Π½ΠΎΠ΅ мСсто для монтирования Π½Π° врСмя Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… систСм. По слоТившСйся Ρ‚Ρ€Π°Π΄ΠΈΡ†ΠΈΠΈ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ дистрибутивы добавляли Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /mnt ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ для Ρ€Π°Π·Π½Ρ‹Ρ… устройств, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ /cdrom ΠΈ /floppy, Π½ΠΎ Π² настоящСС врСмя ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ ΠΈΡ… Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ /media, Π²Π΅Ρ€Π½ΡƒΠ² /mnt Π΅Π³ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠ΅ Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ - Π΅Π΄ΠΈΠ½ΠΎΠ΅ мСсто размСщСния Π²Π΅Ρ€Ρ…Π½Π΅Π³ΠΎ уровня для Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ монтирования (single top-level temporary mount location).

β–‘ /opt - ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ для поставщиков ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для вставки ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, добавляСмых ΠΊ Π±Π°Π·ΠΎΠ²ΠΎΠΌΡƒ дистрибутиву. Дистрибутивы Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΈΠΌ для хранСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ поставляСтся ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ стандартного дистрибутива, Π΅Π³ΠΎ слСдуСт ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ для использования сторонними поставщиками. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ поставщики Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ со своими ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ ΠΈ Π² Π½ΠΈΡ… ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ /bin ΠΈ /lib, для Ρ„Π°ΠΉΠ»ΠΎΠ², относящихся ΠΊ ΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

По принятому соглашСнию ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ Open Source Linux ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /usr/local для инсталляции.

β–‘ /root - это ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ для Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ root. Он Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² Π²Π΅Ρ‚Π²ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° /home Π² Π΄Π΅Ρ€Π΅Π²Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅.

β–‘ /sbin - примСняСтся для ΠΊΠΎΠΌΠ°Π½Π΄, ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ систСмным администратором ΠΈ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΡ…ΡΡ Π²ΠΎ врСмя Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ систСмы Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π—Π΄Π΅ΡΡŒ ΠΎΠ±ΠΈΡ‚Π°ΡŽΡ‚ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

, ΠΈ .

β–‘ /srv - ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для размСщСния Π΄Π°Π½Π½Ρ‹Ρ… мСстного назначСния Π² Ρ€Π΅ΠΆΠΈΠΌΠ΅ "Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для чтСния", Π½ΠΎ Π² настоящСС врСмя ΠΎΠ½ ΡˆΠΈΡ€ΠΎΠΊΠΎ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.

β–‘ /tmp - примСняСтся для Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². ΠžΠ±Ρ‹Ρ‡Π½ΠΎ, Π½ΠΎ Π½Π΅ всСгда, очищаСтся ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ систСмы.

β–‘ /usr - довольно слоТная Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Π°Ρ файловая систСма, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, содСрТащая всС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ систСмного Ρ‚ΠΈΠΏΠ° ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Π΅ ΠΏΡ€ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ систСмы ΠΈΠ»ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΌ Ρ€Π΅ΠΆΠΈΠΌΠ΅. Π’ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ /bin, /lib, /X11R6 ΠΈ /local.

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

Когда Ρ‚ΠΎΠ»ΡŒΠΊΠΎ появились систСмы UNIX ΠΈ Linux, ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /usr Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠΌΠ΅Π» ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ для рСгистраций, Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹ ΠΈ Ρ‚.ΠΏ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС эти ΠΏΠΎΠ΄ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΡƒΠ΄Π°Π»Π΅Π½Ρ‹ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° usr ΠΈ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ var. ΠŸΡ€Π΅ΠΈΠΌΡƒΡ‰Π΅ΡΡ‚Π²ΠΎ Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ /usr ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΌΠΎΠ½Ρ‚ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ Ρ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠΉ систСмой, Π΅Π΅ ΠΌΠΎΠ³ΡƒΡ‚ совмСстно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ систСмы Π² сСти, ΠΈ ΠΎΠ½ стал ΠΌΠ΅Π½Π΅Π΅ чувствитСлСн ΠΊ поврСТдСниям систСмы, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°ΡŽΡ‚ Π΅Π΅ нСуправляСмым ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈΠ·-Π·Π° ΠΎΡ‚ΠΊΠ°Π·Π° элСктропитания.

β–‘ /var - содСрТит часто ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠ΅ΡΡ Π΄Π°Π½Π½Ρ‹Π΅, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ»Ρ‹ Π±ΡƒΡ„Π΅Ρ€ΠΎΠ² ΠΏΠ΅Ρ‡Π°Ρ‚ΠΈ, Ρ„Π°ΠΉΠ»Ρ‹ рСгистраций ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠΈ элСктронной ΠΏΠΎΡ‡Ρ‚Ρ‹.

GΠ‘Π‘ - это свободно доступный ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ компилятор для языков C, C++.

ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° gcc , запускаСмая ΠΈΠ· ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки, прСдставяляСт собой надстройку Π½Π°Π΄ Π³Ρ€ΡƒΠΏΠΏΠΎΠΉ компиляторов. Π’ зависимости ΠΎΡ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ ΠΈΠΌΠ΅Π½ Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², ΠΈ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠΏΡ†ΠΈΠΉ, gcc запускаСт Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ прСпроцСссоры, компиляторы, Π»ΠΈΠ½ΠΊΠ΅Ρ€Ρ‹.

Π€Π°ΠΉΠ»Ρ‹ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .cc ΠΈΠ»ΠΈ .C Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ, ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π° языкС C++, Ρ„Π°ΠΉΠ»Ρ‹ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .c ΠΊΠ°ΠΊ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° языкС C, Π° Ρ„Π°ΠΉΠ»Ρ‹ c Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ .o ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ.

Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исходный ΠΊΠΎΠ΄ C++, находящийся Π² Ρ„Π°ΠΉΠ»Π΅ F.cc , ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» F.o , Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

Gcc -c F.cc

ΠžΠΏΡ†ΠΈΡ –c ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ Β«Ρ‚ΠΎΠ»ΡŒΠΊΠΎ компиляция».

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ нСсколько ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹Ρ… ΠΈΠ· исходного ΠΊΠΎΠ΄Π° - F1.o , F2.o , ... - Π² Π΅Π΄ΠΈΠ½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ» F , Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ввСсти ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

Gcc -o F F1.o F2.o

ΠžΠΏΡ†ΠΈΡ -o Π·Π°Π΄Π°Π΅Ρ‚ имя исполняСмого Ρ„Π°ΠΉΠ»Π°.

МоТно ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π΄Π²Π° этапа ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ - ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΡƒ - Π² ΠΎΠ΄ΠΈΠ½ ΠΎΠ±Ρ‰ΠΈΠΉ этап с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

Gcc -o F F1.cc ... -lg++

- Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ компиляции ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ. ΠžΠΏΡ†ΠΈΡ –lg++ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ языка Π‘++, - Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.
ПослС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Π±ΡƒΠ΄Π΅Ρ‚ создан исполняСмый Ρ„Π°ΠΉΠ» F, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹

./F

- список Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки Π’Π°ΡˆΠ΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.
Π’ процСссС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΎΡ‡Π΅Π½ΡŒ часто приходится ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ Π½Π°Π·Ρ‹Π²Π°ΡŽΡ‚ Π½Π°Π±ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², сгруппированных Π² Π΅Π΄ΠΈΠ½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΈ проиндСксированных. Когда ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π² спискС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² для ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, ΠΎΠ½Π° провСряСт, содСрТат Π»ΠΈ ΡƒΠΆΠ΅ скомпонованныС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π²Ρ‹Π·ΠΎΠ²Ρ‹ для Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. Если Ρ‚Π°ΠΊΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π°ΠΉΠ΄Π΅Π½Ρ‹, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ΡΡ с ΠΊΠΎΠ΄ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° ΠΈΠ· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΈ Π²ΠΈΠ΄Π° -lname . Π’ этом случаС Π² стандартных ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ /lib , /usr/lib, /usr/local/lib Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Π΄Π΅Π½ поиск Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² Ρ„Π°ΠΉΠ»Π΅ с ΠΈΠΌΠ΅Π½Π΅ΠΌ libname.a . Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ пСрСчислСны послС исходных ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², содСрТащих Π²Ρ‹Π·ΠΎΠ²Ρ‹ ΠΊ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ функциям.

ΠžΠΏΡ†ΠΈΠΈ компиляции

Π‘Ρ€Π΅Π΄ΠΈ мноТСства ΠΎΠΏΡ†ΠΈΠΉ компиляции ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ часто ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π»ΡΡŽΡ‚ΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅:

ΠžΠΏΡ†ΠΈΡ НазначСниС
-c Π­Ρ‚Π° опция ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ компиляция. Из исходных Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² Π²ΠΈΠ΄Π΅ name.o . Компоновка Π½Π΅ производится.
-Dname=value ΠžΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ имя name Π² ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ value . Π­Ρ„Ρ„Π΅ΠΊΡ‚ Ρ‚Π°ΠΊΠΎΠΉ ΠΆΠ΅, ΠΊΠ°ΠΊ Π½Π°Π»ΠΈΡ‡ΠΈΠ΅ строки #define name value Π² Π½Π°Ρ‡Π°Π»Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π§Π°ΡΡ‚ΡŒ =value ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΎΠΏΡƒΡ‰Π΅Π½Π°, Π² этом случаС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Ρ€Π°Π²Π½ΠΎ 1.
-o file-name Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ file-name Π² качСствС ΠΈΠΌΠ΅Π½ΠΈ для создаваСмого Ρ„Π°ΠΉΠ»Π°.
-lname Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ libname.so
-Llib-path
-Iinclude-path
Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊ стандартным ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°ΠΌ поиска Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΡƒΡ‚ΠΈ lib-path ΠΈ include-path соотвСтствСнно.
-g ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ исполняСмый Ρ„Π°ΠΉΠ» ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ для ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° gdb . ΠžΠΏΡ†ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π° ΠΈ для компиляции, ΠΈ для ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ. Π’ сочСтании –g рСкомСндуСтся ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ†ΠΈΡŽ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ –O0 (см.Π½ΠΈΠΆΠ΅)
-MM ВывСсти зависимости ΠΎΡ‚ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π² Π‘ΠΈ ΠΈΠ»ΠΈ Π‘++ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅, Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, подходящСм для ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ make . ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ ΠΈΠ»ΠΈ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ Π½Π΅ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ.
-pg ΠŸΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ исполняСмый Ρ„Π°ΠΉΠ» инструкции профилирования для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ gprof . ΠžΠΏΡ†ΠΈΡ Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ ΡƒΠΊΠ°Π·Π°Π½Π° ΠΈ для компиляции, ΠΈ для ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ. Бобранная с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ -pg ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΡ€ΠΈ запускС Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ Ρ„Π°ΠΉΠ» статистики. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° gprof Π½Π° основС этого Ρ„Π°ΠΉΠ»Π° создаСт Ρ€Π°ΡΡˆΠΈΡ„Ρ€ΠΎΠ²ΠΊΡƒ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ врСмя, ΠΏΠΎΡ‚Ρ€Π°Ρ‡Π΅Π½Π½ΠΎΠ΅ Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.
-Wall Π’Ρ‹Π²ΠΎΠ΄ сообщСний ΠΎ всСх прСдупрСТдСниях ΠΈΠ»ΠΈ ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ…, Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‰ΠΈΡ… Π²ΠΎ врСмя компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.
-O1
-O2
-O3
Π Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.
-O0 НС ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ многочислСнныС -O ΠΎΠΏΡ†ΠΈΠΈ с Π½ΠΎΠΌΠ΅Ρ€Π°ΠΌΠΈ ΠΈΠ»ΠΈ Π±Π΅Π· Π½ΠΎΠΌΠ΅Ρ€ΠΎΠ² уровня, Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ являСтся послСдняя такая опция.
-I Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для добавлСния Π²Π°ΡˆΠΈΡ… собствСнных ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² для поиска Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π² процСссС сборки
-L ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для добавлСния Π²Π°ΡˆΠΈΡ… собствСнных ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² для поиска Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π² процСссС сборки.
-l ΠŸΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ΡΡ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊΡƒ. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для добавлСния Π²Π°ΡˆΠΈΡ… собствСнных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ для поиска Π² процСссС сборки.

GCC Π²Ρ…ΠΎΠ΄ΠΈΡ‚ Π² состав любого дистрибутива Linux ΠΈ, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, устанавливаСтся ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π˜Π½Ρ‚Π΅Ρ€Ρ„Π΅ΠΉΡ GCC, это стандартный интСрфСйс компилятора Π½Π° UNIX ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅, уходящий своими корнями Π² ΠΊΠΎΠ½Π΅Ρ† 60-Ρ…, Π½Π°Ρ‡Π°Π»ΠΎ 70-Ρ… Π³ΠΎΠ΄ΠΎΠ² ΠΏΡ€ΠΎΡˆΠ»ΠΎΠ³ΠΎ Π²Π΅ΠΊΠ° - интСрфСйс ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки. НС стоит ΠΏΡƒΠ³Π°Ρ‚ΡŒΡΡ, Π·Π° ΠΏΡ€ΠΎΡˆΠ΅Π΄ΡˆΠ΅Π΅ врСмя ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ взаимодСйствия с ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ Π±Ρ‹Π» ΠΎΡ‚Ρ‚ΠΎΡ‡Π΅Π½ Π΄ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΠ³ΠΎ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²Π°, ΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с GCC (ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ ΠΈ ΠΏΡƒΡ‚Π½ΠΎΠ³ΠΎ тСкстового Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€Π°) ΠΏΡ€ΠΎΡ‰Π΅, Ρ‡Π΅ΠΌ с любой ΠΈΠ· соврСмСнных Π²ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹Ρ… IDE. Авторы Π½Π°Π±ΠΎΡ€Π° ΠΏΠΎΡΡ‚Π°Ρ€Π°Π»ΠΈΡΡŒ максимально Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ процСсс компиляции ΠΈ сборки ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ gcc , ΠΎΠ½Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки (ΠΎΠΏΡ†ΠΈΠΈ ΠΈ ΠΈΠΌΠ΅Π½Π° Ρ„Π°ΠΉΠ»ΠΎΠ²) ΠΈ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π²Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, Π² соотвСтствии с ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ языком программирования, запускаСт свой компилятор, Π·Π°Ρ‚Π΅ΠΌ, Ссли это Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ, gcc автоматичСски Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ассСмблСр ΠΈ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ (ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Ρ‰ΠΈΠΊ).

Π›ΡŽΠ±ΠΎΠΏΡ‹Ρ‚Π½ΠΎ, компиляторы ΠΎΠ΄Π½ΠΈ ΠΈΠ· Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ UNIX для ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π½Π΅ Π±Π΅Π·Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΎ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ². По Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ GCC опрСдСляСт Ρ‡Ρ‚ΠΎ Π·Π° Ρ„Π°ΠΉΠ» ΠΏΠ΅Ρ€Π΅Π΄ Π½ΠΈΠΌ ΠΈ, Ρ‡Ρ‚ΠΎ с Π½ΠΈΠΌ Π½ΡƒΠΆΠ½ΠΎ (ΠΌΠΎΠΆΠ½ΠΎ) ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ. Π€Π°ΠΉΠ»Ρ‹ исходного ΠΊΠΎΠ΄Π° Π½Π° языкС C Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .c , Π½Π° языкС C++ , ΠΊΠ°ΠΊ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, .cpp , Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π½Π° языкС C .h , ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ .o ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Если ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅, gcc Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ (Ссли Π²ΠΎΠΎΠ±Ρ‰Π΅ ΡΠΎΠ³Π»Π°ΡΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ).

ΠŸΠ΅Ρ€Π΅ΠΉΠ΄Ρ‘ΠΌ ΠΊ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅. НапишСм, ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈ исполним ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½Π΅Π·Π°ΠΌΡ‹ΡΠ»ΠΎΠ²Π°Ρ‚ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ. НС Π±ΡƒΠ΄Π΅ΠΌ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΈΡ‡Π°Ρ‚ΡŒ, Π² качСствС исходного Ρ„Π°ΠΉΠ»Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° языкС C сотворим Ρ„Π°ΠΉΠ» с Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΠΌ содСрТимым:

/* hello.c */

#include

Main(void )
{

Printf("Hello World \n " );

return 0 ;

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ c hello.c ΠΎΡ‚Π΄Π°Π΄ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

$ gcc hello.c

Π§Π΅Ρ€Π΅Π· нСсколько Π΄ΠΎΠ»Π΅ΠΉ сСкунды Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΏΠΎΡΠ²ΠΈΡ‚ΡŒΡΡ Ρ„Π°ΠΉΠ» a.out :

$ ls
a.out hello.c

Π­Ρ‚ΠΎ ΠΈ Π΅ΡΡ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ» нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ gcc присваиваСт Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠΌΡƒ исполняСмому Ρ„Π°ΠΉΠ»Ρƒ имя a.out (ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ ΠΎΡ‡Π΅Π½ΡŒ Π΄Π°Π²Π½ΠΎ это имя ΠΎΠ·Π½Π°Ρ‡Π°Π»ΠΎ assembler output ).

$ file a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped

Запустим ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠΈΠΉΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚:

$ ./a.out
Hello World


ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ запуска Π½Π° исполнСниС Ρ„Π°ΠΉΠ»Π° ΠΈΠ· Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ явно ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ? Если ΠΏΡƒΡ‚ΡŒ ΠΊ исполняСмому Ρ„Π°ΠΉΠ»Ρƒ Π½Π΅ ΡƒΠΊΠ°Π·Π°Π½ явно, ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ°, интСрпрСтируя ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΠΈΡ‰Π΅Ρ‚ Ρ„Π°ΠΉΠ» Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…, список ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π·Π°Π΄Π°Π½ систСмной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ PATH .

$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

ΠšΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ Π² спискС Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Ρ‹ символом двоСточия. ΠŸΡ€ΠΈ поискС Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° просматриваСт ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ Π² Ρ‚ΠΎΠΌ порядкС, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ пСрСчислСны Π² спискС. По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΈΠ· сообраТСний бСзопасности, Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ . Π² список Π½Π΅ внСсСн, соотвСтствСнно, ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠ° исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² Π½Π΅ΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π½Π΅ рСкомСндуСтся Π²Π½ΠΎΡΠΈΡ‚ΡŒ . Π² PATH ? БчитаСтся, Ρ‡Ρ‚ΠΎ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠΉ систСмС всСгда найдСтся ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½Π΅Ρ…ΠΎΡ€ΠΎΡˆΠΈΠΉ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ размСстит Π² общСдоступном ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ Π²Ρ€Π΅Π΄ΠΎΠ½ΠΎΡΠ½ΡƒΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ с ΠΈΠΌΠ΅Π½Π΅ΠΌ исполняСмого Ρ„Π°ΠΉΠ»Π°, ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΌ с ΠΈΠΌΠ΅Π½Π΅ΠΌ ΠΊΠ°ΠΊΠΎΠΉ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, часто Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΠΎΠΉ мСстным администратором с ΠΏΡ€Π°Π²Π°ΠΌΠΈ ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ... Π—Π°Π³ΠΎΠ²ΠΎΡ€ удастся Ссли . стоит Π² Π½Π°Ρ‡Π°Π»Π΅ списка ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ².


Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° file Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΈΠΏΠ΅ (с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния систСмы) ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½ΠΎΠ³ΠΎ Π² ΠΊΠΎΠΌΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС Ρ„Π°ΠΉΠ»Π°, для Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Ρ‚ΠΈΠΏΠΎΠ² Ρ„Π°ΠΉΠ»ΠΎΠ² Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ всякиС Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ свСдСния ΠΊΠ°ΡΠ°ΡŽΡ‰ΠΈΠ΅ΡΡ содСрТимого Ρ„Π°ΠΉΠ»Π°.

$ file hello.c
hello.c: ASCII C program text
$ file annotation.doc
annotation.doc: CDF V2 Document, Little Endian, Os: Windows, Version 5.1, Code page: 1251, Author: MIH, Template: Normal.dot, Last Saved By: MIH, Revision Number: 83, Name of Creating Application: Microsoft Office Word, Total Editing Time: 09:37:00, Last Printed: Thu Jan 22 07:31:00 2009, Create Time/Date: Mon Jan 12 07:36:00 2009, Last Saved Time/Date: Thu Jan 22 07:34:00 2009, Number of Pages: 1, Number of Words: 3094, Number of Characters: 17637, Security: 0

Π’ΠΎΡ‚ собствСнно ΠΈ всё, Ρ‡Ρ‚ΠΎ трСбуСтся ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ примСнСния gcc :)

Имя Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ исполняСмого Ρ„Π°ΠΉΠ»Π° (ΠΊΠ°ΠΊ Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ ΠΈ любого Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Ρ„ΠΎΡ€ΠΌΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ gcc ) ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΈ -o :

$ gcc -o hello hello.c
$ ls
hello hello.c
$ ./hello
Hello World


Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ функция main() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ казалось Π±Ρ‹ Π½ΠΈ ΠΊΠΎΠΌΡƒ Π½Π΅ Π½ΡƒΠΆΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 0 . Π’ UNIX-ΠΏΠΎΠ΄ΠΎΠ±Π½Ρ‹Ρ… систСмах, ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, принято Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΡƒΡŽ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΡƒ Ρ†Π΅Π»ΠΎΠ΅ число - Π² случаС ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ноль, любоС Π΄Ρ€ΡƒΠ³ΠΎΠ΅ Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС. Π˜Π½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΎΠ±ΠΎΠ»ΠΎΡ‡ΠΊΠΈ автоматичСски присвоит ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ срСды с ΠΈΠΌΠ΅Π½Π΅ΠΌ ? . ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π΅Ρ‘ содСрТимоС ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ echo $? :

$ ./hello
Hello World
$ echo $?
0

Π’Ρ‹ΡˆΠ΅ Π±Ρ‹Π»ΠΎ сказано, Ρ‡Ρ‚ΠΎ gcc это ΡƒΠΏΡ€Π°Π²Π»ΡΡŽΡ‰Π°Ρ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, прСдназначСнная для Π°Π²Ρ‚ΠΎΠΌΠ°Ρ‚ΠΈΠ·Π°Ρ†ΠΈΠΈ процСсса компиляции. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Π½Π° самом Π΄Π΅Π»Π΅ происходит Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ исполнСния ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ gcc hello.c .

ΠŸΡ€ΠΎΡ†Π΅ΡΡ компиляции ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π½Π° 4 основных этапа: ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° прСпроцСссором, собствСнно компиляция, ассСмблированиС, Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠ° (связываниС).

ΠžΠΏΡ†ΠΈΠΈ gcc ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‚ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ процСсс Π½Π° любом ΠΈΠ· этих этапов.

ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΎΡ€ осущСствляСт ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΡƒ исходного Ρ„Π°ΠΉΠ»Π° ΠΊ компиляции - Π²Ρ‹Ρ€Π΅Π·Π°Π΅Ρ‚ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, добавляСт содСрТимоС Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² (Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° прСпроцСссора #include ), Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ раскрытиС макросов (символичСских констант, Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° прСпроцСссора #define ).

Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π²ΡˆΠΈΡΡŒ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ -E дальнСйшиС дСйствия gcc ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€Π΅Ρ€Π²Π°Ρ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ содСрТимоС Ρ„Π°ΠΉΠ»Π°, ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½ΠΎΠ³ΠΎ прСпроцСссором.

$ gcc -E -o hello.i hello.c
$ ls
hello.c hello.i
$ less hello.i
. . .
# 1 "/usr/include/stdio.h" 1 3 4
# 28 "/usr/include/stdio.h" 3 4
# 1 "/usr/include/features.h" 1 3 4
. . .
typedef unsigned char __u_char;
typedef unsigned short int __u_short;
typedef unsigned int __u_int;
. . .
extern int printf (__const char *__restrict __format, ...);
. . .
# 4 "hello.c" 2
main (void)
{
printf ("Hello World\n");
return 0;
}

ПослС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прСпроцСссором исходный тСкст нашСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Ρ€Π°Π·Π±ΡƒΡ… ΠΈ ΠΏΡ€ΠΈΠΎΠ±Ρ€Π΅Π» Π½Π΅ ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΉ Π²ΠΈΠ΄. Код, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ ΠΊΠΎΠ³Π΄Π°-Ρ‚ΠΎ собствСнноручно Π½Π°Π±ΠΈΠ»ΠΈ, свСлся ΠΊ нСскольким строчкам Π² самом ΠΊΠΎΠ½Ρ†Π΅ Ρ„Π°ΠΉΠ»Π°. ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° - ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ C . Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» stdio.h сам ΠΏΠΎ сСбС содСрТит ΠΌΠ½ΠΎΠ³ΠΎ всСго Ρ€Π°Π·Π½ΠΎΠ³ΠΎ Π΄Π° Π΅Ρ‰Ρ‘ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π° hello.i . По соглашСниям gcc Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .i соотвСтствуСт Ρ„Π°ΠΉΠ»Π°ΠΌ с исходным ΠΊΠΎΠ΄ΠΎΠΌ Π½Π° языкС C Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ прСпроцСссором. Π’Π°ΠΊΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ минуя прСпроцСссор:

$ gcc -o hello hello.i
$ ls
hello hello.c hello.i
$ ./hello
Hello World

ПослС прСпроцСссинга наступаСт ΠΎΡ‡Π΅Ρ€Π΅Π΄ΡŒ компиляции. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΠ΅Ρ‚ исходный тСкст ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° языкС высокого уровня Π² ΠΊΠΎΠ΄ Π½Π° языкС ассСмблСра.

Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ слова компиляция Ρ€Π°Π·ΠΌΡ‹Ρ‚ΠΎ. ВикипСдисты, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚, ΡΡΡ‹Π»Π°ΡΡΡŒ Π½Π° ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Ρ‹Π΅ стандарты, Ρ‡Ρ‚ΠΎ компиляция это "ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΎΠΉ-компилятором исходного тСкста ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, написанного Π½Π° языкС программирования высокого уровня, Π² язык, Π±Π»ΠΈΠ·ΠΊΠΈΠΉ ΠΊ ΠΌΠ°ΡˆΠΈΠ½Π½ΠΎΠΌΡƒ, ΠΈΠ»ΠΈ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄." Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ это ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π½Π°ΠΌ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚, язык ассСмблСра Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π±Π»ΠΈΠΆΠ΅ ΠΊ ΠΌΠ°ΡˆΠΈΠ½Π½ΠΎΠΌΡƒ, Ρ‡Π΅ΠΌ C . Но Π² ΠΎΠ±Ρ‹Π΄Π΅Π½Π½ΠΎΠΉ ΠΆΠΈΠ·Π½ΠΈ ΠΏΠΎΠ΄ компиляциСй Ρ‡Π°Ρ‰Π΅ всСго ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚ просто Π»ΡŽΠ±ΡƒΡŽ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ, ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΡƒΡŽΡ‰ΡƒΡŽ исходный ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° ΠΊΠ°ΠΊΠΎΠΌ-Π»ΠΈΠ±ΠΎ языкС программирования Π² исполняСмый ΠΊΠΎΠ΄. Π’ΠΎ Π΅ΡΡ‚ΡŒ процСсс, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰ΠΈΠΉ всС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ ΠΎΠ·Π½Π°Ρ‡Π΅Π½Π½Ρ‹Ρ… Π²Ρ‹ΡˆΠ΅, этапа Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π½Π°Π·Π²Π°Π½ компиляциСй. Подобная Π½Π΅ΠΎΠ΄Π½ΠΎΠ·Π½Π°Ρ‡Π½ΠΎΡΡ‚ΡŒ присутствуСт ΠΈ Π² настоящСм тСкстС. Π‘ Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны, ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΡŽ прСобразования исходного тСкста ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΊΠΎΠ΄ Π½Π° языкС ассСмблСра ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠ·Π½Π°Ρ‡ΠΈΡ‚ΡŒ ΠΈ словом трансляция - "ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, прСдставлСнной Π½Π° ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ· языков программирования, Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ языкС ΠΈ, Π² ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½ΠΎΠΌ смыслС, Ρ€Π°Π²Π½ΠΎΡΠΈΠ»ΡŒΠ½ΡƒΡŽ ΠΏΠ΅Ρ€Π²ΠΎΠΉ".

ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ процСсс создания исполняСмого Ρ„Π°ΠΉΠ»Π° ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ компиляции позволяСт опция -S :

$ gcc -S hello.c
$ ls
hello.c hello.s
$ file hello.s
hello.s: ASCII assembler program text
$ less hello.s
.file "hello.c"
.section .rodata
.LC0:
.string "Hello World"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
andl $-16, %esp
subl $16, %esp
movl $.LC0, (%esp)
call puts
movl $0, %eax
leave
ret
.size main, .-main


Π’ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ появился Ρ„Π°ΠΉΠ» hello.s , содСрТащий Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π° языкС ассСмблСра. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ имя Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΎΠΏΡ†ΠΈΠΈ -o Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π½Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ, gcc автоматичСски Π΅Π³ΠΎ сгСнСрировал, Π·Π°ΠΌΠ΅Π½ΠΈΠ² Π² ΠΈΠΌΠ΅Π½ΠΈ исходного Ρ„Π°ΠΉΠ»Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .c Π½Π° .s . Для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° основных ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ gcc имя Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° формируСтся ΠΏΡƒΡ‚Π΅ΠΌ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ Π·Π°ΠΌΠ΅Π½Ρ‹. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .s стандартноС для Ρ„Π°ΠΉΠ»ΠΎΠ² с исходным ΠΊΠΎΠ΄ΠΎΠΌ Π½Π° языкС ассСмблСра.

ΠŸΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ исполняСмый ΠΊΠΎΠ΄ разумССтся ΠΌΠΎΠΆΠ½ΠΎ ΠΈ ΠΈΠ· Ρ„Π°ΠΉΠ»Π° hello.s :

$ gcc -o hello hello.s
$ ls
hello hello.c hello.s
$ ./hello
Hello World

Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ этап опСрация ассмСблирования - трансляция ΠΊΠΎΠ΄Π° Π½Π° языкС ассСмблСра Π² ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ - ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» содСрТит Π±Π»ΠΎΠΊΠΈ Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΊ исполнСнию машинного ΠΊΠΎΠ΄Π°, Π±Π»ΠΎΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…, Π° Ρ‚Π°ΠΊΠΆΠ΅ список ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π² Ρ„Π°ΠΉΠ»Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… (Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ символов ), Π½ΠΎ ΠΏΡ€ΠΈ этом Π² Π½Π΅ΠΌ Π½Π΅ Π·Π°Π΄Π°Π½Ρ‹ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½Ρ‹Π΅ адрСса ссылок Π½Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ Π΄Π°Π½Π½Ρ‹Π΅. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½ Π½Π° исполнСниС нСпосрСдствСнно, Π½ΠΎ Π² дальнСйшСм (Π½Π° этапС Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ) ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ объСдинСн с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΌΠΈ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ (ΠΏΡ€ΠΈ этом, Π² соотвСтствии с Ρ‚Π°Π±Π»ΠΈΡ†Π°ΠΌΠΈ символов, Π±ΡƒΠ΄ΡƒΡ‚ вычислСны ΠΈ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½Ρ‹ адрСса ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ пСрСкрСстных ссылок). ΠžΠΏΡ†ΠΈΡ gcc -c , останавливаСт процСсс ΠΏΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ этапа ассСмблирования:

$ gcc -c hello.c
$ ls
hello.c hello.o
$ file hello.o
hello.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped

Для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² принято стандартноС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .o .

Если ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» hello.o ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΡƒ, послСдний вычислит адрСса ссылок, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ ΠΊΠΎΠ΄ запуска ΠΈ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠΎΠ΄ Π²Ρ‹Π·ΠΎΠ²Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΌΡ‹ Π±ΡƒΠ΄Π΅ΠΌ ΠΎΠ±Π»Π°Π΄Π°Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΌ исполняСмым Ρ„Π°ΠΉΠ»ΠΎΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

$ gcc -o hello hello.o
$ ls
hello hello.c hello.o
$ ./hello
Hello World

Π’ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ сСйчас ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π»ΠΈ (Π²Π΅Ρ€Π½Π΅Π΅ gcc ΠΏΡ€ΠΎΠ΄Π΅Π»Π°Π» Π·Π° нас) ΠΈ Π΅ΡΡ‚ΡŒ содСрТаниС послСднСго этапа - Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ (связывания, ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ).

Ну Π²ΠΎΡ‚ ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ ΠΎ компиляции ΠΈ всС. Π’Π΅ΠΏΠ΅Ρ€ΡŒ коснСмся Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ…, Π½Π° ΠΌΠΎΠΉ взгляд Π²Π°ΠΆΠ½Ρ‹Ρ…, ΠΎΠΏΡ†ΠΈΠΉ gcc .

ΠžΠΏΡ†ΠΈΡ -I ΠΏΡƒΡ‚ΡŒ/ΠΊ/ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ/с/Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΌΠΈ/Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ - добавляСт ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΊ списку ΠΏΡƒΡ‚Π΅ΠΉ поиска Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². ΠšΠ°Ρ‚Π°Π»ΠΎΠ³, Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ -I просматриваСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, Π·Π°Ρ‚Π΅ΠΌ поиск продолТаСтся Π² стандартных систСмных ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…. Если ΠΎΠΏΡ†ΠΈΠΉ -I нСсколько, Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠΌΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°ΡŽΡ‚ΡΡ слСва Π½Π° ΠΏΡ€Π°Π²ΠΎ, ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ появлСния ΠΎΠΏΡ†ΠΈΠΉ.

ΠžΠΏΡ†ΠΈΡ -Wall - Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ прСдупрСТдСния, Π²Ρ‹Π·Π²Π°Π½Π½Ρ‹Π΅ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ ошибками Π² ΠΊΠΎΠ΄Π΅, Π½Π΅ ΠΏΡ€Π΅ΠΏΡΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌΠΈ компиляции ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π½ΠΎ способными привСсти, ΠΏΠΎ мнСнию компилятора, ΠΊ Ρ‚Π΅ΠΌ ΠΈΠ»ΠΈ ΠΈΠ½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ ΠΏΡ€ΠΈ Π΅Ρ‘ исполнСнии. ВаТная ΠΈ полСзная опция, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ gcc Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡƒΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΅ΠΉ всСгда. НапримСр масса ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π½Π° ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ компиляции Π²ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°:

1 /* remark.c */
2
3 static int k = 0 ;
4 static int l(int a);
5
6 main()
7 {
8
9 int a;
10
11 int b, c;
12
13 b + 1 ;
14
15 b = c;
16
17 int *p;
18
19 b = *p;
20
21 }


$ gcc -o remark remark.c
$ gcc -Wall -o remark remark.c
remark.c:7: warning: return type defaults to β€˜int’

remark.c:13: warning: statement with no effect
remark.c:9: warning: unused variable β€˜a’
remark.c:21: warning: control reaches end of non-void function
remark.c: At top level:
remark.c:3: warning: β€˜k’ defined but not used
remark.c:4: warning: β€˜l’ declared β€˜static’ but never defined
remark.c: In function β€˜main’:
remark.c:15: warning: β€˜c’ is used uninitialized in this function
remark.c:19: warning: β€˜p’ is used uninitialized in this function

ΠžΠΏΡ†ΠΈΡ -Werror - ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ всС прСдупрСТдСния Π² ошибки. Π’ случаС появлСния прСдупрСТдСния ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅Ρ‚ процСсс компиляции. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ совмСстно с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ -Wall .

$ gcc -Werror -o remark remark.c
$ gcc -Werror -Wall -o remark remark.c
cc1: warnings being treated as errors
remark.c:7: error: return type defaults to β€˜int’
remark.c: In function β€˜main’:
remark.c:13: error: statement with no effect
remark.c:9: error: unused variable β€˜a’

ΠžΠΏΡ†ΠΈΡ -g - ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅Ρ‚ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΈΠ»ΠΈ исполняСмый Ρ„Π°ΠΉΠ» ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΎΡ‚Π»Π°Π΄Ρ‡ΠΈΠΊΠ° gdb . ΠŸΡ€ΠΈ сборкС ΠΊΠ°ΠΊΠΎΠ³ΠΎ-Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° с Ρ†Π΅Π»ΡŒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ, ΠΎΠΏΡ†ΠΈΡŽ -g Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ Π½Π° этапС компиляции Ρ‚Π°ΠΊ ΠΈ Π½Π° этапС ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ.

ΠžΠΏΡ†ΠΈΠΈ -O1 , -O2 , -O3 - Π·Π°Π΄Π°ΡŽΡ‚ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠ³ΠΎ компилятором. Π‘ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π½ΠΎΠΌΠ΅Ρ€Π°, ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ возрастаСт. ДСйствиС ΠΎΠΏΡ†ΠΈΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π²ΠΎΡ‚ Π½Π° Ρ‚Π°ΠΊΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅.

Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ»:

/* circle.c */

Main(void )
{

int i;

for (i = 0 ; i < 10 ; ++i)
;

return i;

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ с ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ:

$ gcc -S circle.c
$ less circle.s
.file "circle.c"
.text
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movl $0, -4(%ebp)
jmp .L2
.L3:
addl $1, -4(%ebp)
.L2:
cmpl $9, -4(%ebp)
jle .L3
movl -4(%ebp), %eax
leave
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits

ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ с ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ:

$ gcc -S -O3 circle.c
$ less circle.s
.file "circle.c"
.text
.p2align 4,15
.globl main
.type main, @function
main:
pushl %ebp
movl $10, %eax
movl %esp, %ebp
popl %ebp
ret
.size main, .-main
.ident "GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3"
.section .note.GNU-stack,"",@progbits

Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС Π² ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅ Π΄Π°ΠΆΠ΅ Π½Π΅Ρ‚ Π½Π°ΠΌΡ‘ΠΊΠ° Π½Π° ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ Ρ†ΠΈΠΊΠ». Π”Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ i , ΠΌΠΎΠΆΠ½ΠΎ Π²Ρ‹Ρ‡ΠΈΡΠ»ΠΈΡ‚ΡŒ Π΅Ρ‰Ρ‘ Π½Π° этапС компиляции, Ρ‡Ρ‚ΠΎ ΠΈ Π±Ρ‹Π»ΠΎ сдСлано.

Π£Π²Ρ‹, для Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Ρ€Π°Π·Π½ΠΈΡ†Π° Π² ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΏΡ€ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… уровнях ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ практичСски Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚Π½Π°...

ΠžΠΏΡ†ΠΈΡ -O0 - отмСняСт ΠΊΠ°ΠΊΡƒΡŽ-Π»ΠΈΠ±ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ΄Π°. ΠžΠΏΡ†ΠΈΡ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π½Π° этапС ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ прилоТСния. Как Π±Ρ‹Π»ΠΎ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π²Ρ‹ΡˆΠ΅, оптимизация ΠΌΠΎΠΆΠ΅Ρ‚ привСсти ΠΊ измСнСнию структуры ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π΄ΠΎ нСузнаваСмости, связь ΠΌΠ΅ΠΆΠ΄Ρƒ исполняСмым ΠΈ исходным ΠΊΠΎΠ΄ΠΎΠΌ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ явной, соотвСтствСнно, пошаговая ΠΎΡ‚Π»Π°Π΄ΠΊΠ° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Π°. ΠŸΡ€ΠΈ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ ΠΎΠΏΡ†ΠΈΠΈ -g , рСкомСндуСтся Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ ΠΈ -O0 .

ΠžΠΏΡ†ΠΈΡ -Os - Π·Π°Π΄Π°Π΅Ρ‚ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ Π½Π΅ ΠΏΠΎ эффСктивности ΠΊΠΎΠ΄Π°, Π° ΠΏΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρƒ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. ΠŸΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΡ€ΠΈ этом Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ сопоставима с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΈ компиляции с ΡƒΡ€ΠΎΠ²Π½Π΅ΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ΠžΠΏΡ†ΠΈΡ -march= architecture - Π·Π°Π΄Π°Π΅Ρ‚ Ρ†Π΅Π»Π΅Π²ΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ процСссора. Бписок ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ ΠΎΠ±ΡˆΠΈΡ€Π΅Π½, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для процСссоров сСмСйства Intel/AMD ΠΌΠΎΠΆΠ½ΠΎ Π·Π°Π΄Π°Ρ‚ΡŒ i386 , pentium , prescott , opteron-sse3 ΠΈ Ρ‚.Π΄. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… дистрибутивов Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Π² Π²ΠΈΠ΄Ρƒ, Ρ‡Ρ‚ΠΎ для ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ с ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ ΠΆΠ΅Π»Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΈ всС ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π±Ρ‹Π»ΠΈ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ с Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ.

Об опциях ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΡƒ Π±ΡƒΠ΄Π΅Ρ‚ сказано Π½ΠΈΠΆΠ΅.

НСбольшоС дополнСниС:

Π’Ρ‹ΡˆΠ΅ Π±Ρ‹Π»ΠΎ сказано, Ρ‡Ρ‚ΠΎ gcc опрСдСляСт Ρ‚ΠΈΠΏ (язык программирования) ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠΎ ΠΈΡ… Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ ΠΈ, Π² соотвСтствии с ΡƒΠ³Π°Π΄Π°Π½Π½Ρ‹ΠΌ Ρ‚ΠΈΠΏΠΎΠΌ (языком), ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ дСйствия Π½Π°Π΄ Π½ΠΈΠΌΠΈ. ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ обязан ΡΠ»Π΅Π΄ΠΈΡ‚ΡŒ Π·Π° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ создаваСмых Ρ„Π°ΠΉΠ»ΠΎΠ², выбирая ΠΈΡ… Ρ‚Π°ΠΊ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ³ΠΎ Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‚ соглашСния gcc . Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ gcc ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ΄ΡΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ. ΠžΠΏΡ†ΠΈΡ gcc -x позволяСт явно ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ язык программирования ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². ДСйствиС ΠΎΠΏΡ†ΠΈΠΈ распространяСтся Π½Π° всС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ пСрСчислСнныС Π² ΠΊΠΎΠΌΠ°Π½Π΄Π΅ Ρ„Π°ΠΉΠ»Ρ‹ (Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ появлСния ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΎΠΏΡ†ΠΈΠΈ -x ). Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΎΠΏΡ†ΠΈΠΈ:

c c-header c-cpp-output

c++ c++-header c++-cpp-output

objective-c objective-c-header objective-c-cpp-output

objective-c++ objective-c++-header objective-c++-cpp-output

assembler assembler-with-cpp

ada

f77 f77-cpp-input

f95 f95-cpp-input

java

НазначСниС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ понятно ΠΈΠ· ΠΈΡ… написания (здСсь cpp Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π½ΠΈ ΠΊΠ°ΠΊΠΎΠ³ΠΎ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ C++ , это Ρ„Π°ΠΉΠ» исходного ΠΊΠΎΠ΄Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ прСпроцСссором). ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ:

$ mv hello.c hello.txt
$ gcc -Wall -x c -o hello hello.txt
$ ./hello
Hello World

РаздСльная компиляция

Бильной стороной языков C/C++ являСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΡΡ‚ΡŒ исходный ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎ нСскольким Ρ„Π°ΠΉΠ»Π°ΠΌ. Π”Π°ΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ большС - Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ компиляции это основа языка, Π±Π΅Π· Π½Π΅Ρ‘ эффСктивноС использованиС C Π½Π΅ мыслимо. ИмСнно ΠΌΡƒΠ»ΡŒΡ‚ΠΈΡ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ позволяСт Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° C ΠΊΡ€ΡƒΠΏΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ Linux (здСсь ΠΏΠΎΠ΄ словом Linux подразумСваСтся ΠΊΠ°ΠΊ ядро, Ρ‚Π°ΠΊ ΠΈ систСма Π² Ρ†Π΅Π»ΠΎΠΌ). Π§Ρ‚ΠΎ Π΄Π°Ρ‘Ρ‚ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½Π°Ρ компиляция программисту?

1. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ (ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°) Π±ΠΎΠ»Π΅Π΅ ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΡ‹ΠΌ. Π€Π°ΠΉΠ» исходника Π½Π° нСсколько дСсятков экранов ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ практичСски Π½Π΅ΠΎΡ…Π²Π°Ρ‚Π½Ρ‹ΠΌ. Если, Π² соотвСтствии с Π½Π΅ΠΊΠΎΠΉ (Π·Π°Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°Π½Π½ΠΎΠΉ) Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ, Ρ€Π°Π·Π±ΠΈΡ‚ΡŒ Π΅Π³ΠΎ Π½Π° ряд Π½Π΅Π±ΠΎΠ»ΡŒΡˆΠΈΡ… Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΎΠ² (ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅), ΡΠΎΠ²Π»Π°Π΄Π°Ρ‚ΡŒ со ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅.

2. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΡΠΎΠΊΡ€Π°Ρ‚ΠΈΡ‚ΡŒ врСмя ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠΉ компиляции ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Если измСнСния внСсСны Π² ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» Π½Π΅Ρ‚ смысла ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вСсь ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, достаточно Π·Π°Π½ΠΎΠ²ΠΎ ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ этот ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ».

3. ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ Ρ€Π°ΡΠΏΡ€Π΅Π΄Π΅Π»ΠΈΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π°Π΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ ΠΌΠ΅ΠΆΠ΄Ρƒ нСсколькими Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌΠΈ. ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ программист Ρ‚Π²ΠΎΡ€ΠΈΡ‚ ΠΈ ΠΎΡ‚Π»Π°ΠΆΠΈΠ²Π°Π΅Ρ‚ свою Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, Π½ΠΎ Π² любой ΠΌΠΎΠΌΠ΅Π½Ρ‚ ΠΌΠΎΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ (ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ) всС ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠ΅ΡΡ Π½Π°Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚.

4. Π‘Π΅Π· Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ компиляции Π½Π΅ сущСствовало Π±Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. ΠŸΠΎΡΡ€Π΅Π΄ΡΡ‚Π²ΠΎΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ΠΎ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ΅ использованиС ΠΈ распространСниС ΠΊΠΎΠ΄Π° Π½Π° C/C++ , ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΊΠΎΠ΄Π° Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ позволяСт с ΠΎΠ΄Π½ΠΎΠΉ стороны ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°ΠΌ простой ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π΅Π³ΠΎ Π² свои ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, с Π΄Ρ€ΡƒΠ³ΠΎΠΉ стороны ΡΠΊΡ€Ρ‹Ρ‚ΡŒ ΠΎΡ‚ Π½ΠΈΡ… ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹Π΅ Π΄Π΅Ρ‚Π°Π»ΠΈ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Работая Π½Π°Π΄ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠΌ, всСгда стоит Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°Ρ‚ΡŒΡΡ Π½Π°Π΄ Ρ‚Π΅ΠΌ, Π° Π½Π΅ ΠΏΠΎΠ½Π°Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ Ρ‡Ρ‚ΠΎ-Π»ΠΈΠ±ΠΎ ΠΈΠ· ΡƒΠΆΠ΅ сдСланного ΠΊΠΎΠ³Π΄Π°-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ? ΠœΠΎΠΆΠ΅Ρ‚ стоит Π·Π°Ρ€Π°Π½Π΅Π΅ Π²Ρ‹Π΄Π΅Π»ΠΈΡ‚ΡŒ ΠΈ ΠΎΡ„ΠΎΡ€ΠΌΠΈΡ‚ΡŒ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° ΠΊΠ°ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ? По ΠΌΠΎΠ΅ΠΌΡƒ, Ρ‚Π°ΠΊΠΎΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄, сущСствСнно ΡƒΠΏΡ€ΠΎΡ‰Π°Π΅Ρ‚ Тизнь ΠΈ экономит массу Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

GCC , разумССтся, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΠΊΠ°ΠΊΠΈΡ… Π»ΠΈΠ±ΠΎ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΉ. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ всС ΠΎΡ‡Π΅Π½ΡŒ просто.

Π’ΠΎΡ‚ практичСский ΠΏΡ€ΠΈΠΌΠ΅Ρ€ (ΠΏΡ€Π°Π²Π΄Π° вСсьма ΠΈ вСсьма условный).

Набор Ρ„Π°ΠΉΠ»ΠΎΠ² исходного ΠΊΠΎΠ΄Π°:

/* main.c */

#include

#include "first.h"
#include "second.h"

int main(void )
{

First();
second();

Printf("Main function... \n " );

return 0 ;


/* first.h */

void first(void );


/* first.c */

#include

#include "first.h"

void first(void )
{

Printf("First function... \n " );


/* second.h */

void second(void );


/* second.c */

#include

#include "second.h"

void second(void )
{

Printf("Second function... \n " );

Π’ ΠΎΠ±Ρ‰Π΅ΠΌ ΠΈΠΌΠ΅Π΅ΠΌ Π²ΠΎΡ‚ Ρ‡Ρ‚ΠΎ:

$ ls
first.c first.h main.c second.c second.h

ВсС это хозяйство ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ:

$ gcc -Wall -o main main.c first.c second.c
$ ./main
First function...
Second function...
Main function...

Волько это Π½Π΅ даст Π½Π°ΠΌ практичСски Π½ΠΈ ΠΊΠ°ΠΊΠΈΡ… бонусов, Π½Ρƒ Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π±ΠΎΠ»Π΅Π΅ структурированного ΠΈ ΡƒΠ΄ΠΎΠ±ΠΎΡ‡ΠΈΡ‚Π°Π΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, разнСсённого ΠΏΠΎ нСскольким Ρ„Π°ΠΉΠ»Π°ΠΌ. ВсС пСрСчислСнныС Π²Ρ‹ΡˆΠ΅ прСимущСства появятся Π² случаС Ρ‚Π°ΠΊΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π° ΠΊ компиляции:

$ gcc -Wall -c main.c
$ gcc -Wall -c first.c
$ gcc -Wall -c second.c
$ ls
first.c first.h first.o main.c main.o second.c second.h second.o
$ gcc -o main main.o first.o second.o
$ ./main
First function...
Second function...
Main function...

Π§Ρ‚ΠΎ ΠΌΡ‹ сдСлали? Из ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ исходного Ρ„Π°ΠΉΠ»Π° (компилируя с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ -c ) ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ». Π—Π°Ρ‚Π΅ΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ слинковали Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ исполняСмый. РазумССтся ΠΊΠΎΠΌΠ°Π½Π΄ gcc стало большС, Π½ΠΎ Π² Ρ€ΡƒΡ‡Π½ΡƒΡŽ Π½ΠΈ ΠΊΡ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π½Π΅ собираСт, для этого Π΅ΡΡ‚ΡŒ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ сборщики (самая популярная make ). ΠŸΡ€ΠΈ использовании ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ сборщиков ΠΈ проявятся всС ΠΈΠ· пСрСчислСнных Π²Ρ‹ΡˆΠ΅ прСимущСств Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ компиляции.

Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос: ΠΊΠ°ΠΊ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ ухитряСтся ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ вмСстС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ вычисляя Π°Π΄Ρ€Π΅ΡΠ°Ρ†ΠΈΡŽ Π²Ρ‹Π·ΠΎΠ²ΠΎΠ²? ΠžΡ‚ΠΊΡƒΠ΄Π° ΠΎΠ½ Π²ΠΎΠΎΠ±Ρ‰Π΅ ΡƒΠ·Π½Π°Ρ‘Ρ‚, Ρ‡Ρ‚ΠΎ Π² Ρ„Π°ΠΉΠ»Π΅ second.o содСрТится ΠΊΠΎΠ΄ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ second() , Π° Π² ΠΊΠΎΠ΄Π΅ Ρ„Π°ΠΉΠ»Π° main.o присутствуСт Π΅Ρ‘ Π²Ρ‹Π·ΠΎΠ²? ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ всё просто - Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ присутствуСт Ρ‚Π°ΠΊ называСмая Ρ‚Π°Π±Π»ΠΈΡ†Π° символов , Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π°Ρ ΠΈΠΌΠ΅Π½Π° Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ ΠΊΠΎΠ΄Π° (Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…). Π›ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ просматриваСт Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ символов ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΈΡ‰Π΅Ρ‚ ΠΎΠ±Ρ‰ΠΈΠ΅ (с ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡŽΡ‰ΠΈΠΌΠΈ ΠΈΠΌΠ΅Π½Π°ΠΌΠΈ) ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΈ, Π½Π° основании Ρ‡Π΅Π³ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄Ρ‹ ΠΎ фактичСском мСстополоТСнии ΠΊΠΎΠ΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ (ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…) ΠΈ, соотвСтствСнно, ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ пСрСрасчёт адрСсов Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π² исполняСмом Ρ„Π°ΠΉΠ»Π΅.

ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ символов ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ nm .

$ nm main.o
U first
00000000 T main
U puts
U second
$ nm first.o
00000000 T first
U puts
$ nm second.o
U puts
00000000 T second

ПоявлСниС Π²Ρ‹Π·ΠΎΠ²Π° puts ΠΎΠ±ΡŠΡΡΠ½ΡΠ΅Ρ‚ΡΡ использованиСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ printf() , ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΠ²ΡˆΠ΅ΠΉΡΡ Π² puts() Π½Π° этапС компиляции.

Π’Π°Π±Π»ΠΈΡ†Π° символов прописываСтся Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ, Π½ΠΎ ΠΈ Π² исполняСмый Ρ„Π°ΠΉΠ»:

$ nm main
08049f20 d _DYNAMIC
08049ff4 d _GLOBAL_OFFSET_TABLE_
080484fc R _IO_stdin_used
w _Jv_RegisterClasses
08049f10 d __CTOR_END__
08049f0c d __CTOR_LIST__
08049f18 D __DTOR_END__
08049f14 d __DTOR_LIST__
08048538 r __FRAME_END__
08049f1c d __JCR_END__
08049f1c d __JCR_LIST__
0804a014 A __bss_start
0804a00c D __data_start
080484b0 t __do_global_ctors_aux
08048360 t __do_global_dtors_aux
0804a010 D __dso_handle
w __gmon_start__
080484aa T __i686.get_pc_thunk.bx
08049f0c d __init_array_end
08049f0c d __init_array_start
08048440 T __libc_csu_fini
08048450 T __libc_csu_init
U __libc_start_main@@GLIBC_2.0
0804a014 A _edata
0804a01c A _end
080484dc T _fini
080484f8 R _fp_hw
080482b8 T _init
08048330 T _start
0804a014 b completed.7021
0804a00c W data_start
0804a018 b dtor_idx.7023
0804840c T first
080483c0 t frame_dummy
080483e4 T main
U puts@@GLIBC_2.0
08048420 T second

Π’ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ символов Π² исполняСмый Ρ„Π°ΠΉΠ» Π² частности Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ для упрощСния ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ. Π’ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ для выполнСния прилоТСния ΠΎΠ½Π° Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ‚ΠΎ ΠΈ Π½ΡƒΠΆΠ½Π°. Для исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, с мноТСством ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π·Π°Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΡƒΡ‡Ρƒ Ρ€Π°Π·Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Ρ‚Π°Π±Π»ΠΈΡ†Π° символов ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ вСсьма ΠΎΠ±ΡˆΠΈΡ€Π½ΠΎΠΉ. Для сокращСния Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² Π²Ρ‹Ρ…ΠΎΠ΄Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π΅Ρ‘ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ, воспользовавшись ΠΎΠΏΡ†ΠΈΠ΅ΠΉ gcc -s .

$ gcc -s -o main main.o first.o second.o
$ ./main
First function...
Second function...
Main function...
$ nm main
nm: main: no symbols

НСобходимо ΠΎΡ‚ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π² Ρ…ΠΎΠ΄Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ, Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π½ΠΈ ΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΎΠΊ контСкста Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, ΠΎΠ½ Π½Π΅ слСдит Π½ΠΈ Π·Π° Ρ‚ΠΈΠΏΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, Π½ΠΈ Π·Π° Ρ‚ΠΈΠΏΠΎΠΌ ΠΈ количСством ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹Ρ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (Π΄Π° Π΅ΠΌΡƒ ΠΈ Π½Π΅ ΠΎΡ‚ΠΊΡƒΠ΄Π° Π²Π·ΡΡ‚ΡŒ Ρ‚Π°ΠΊΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ). ВсС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ коррСктности Π²Ρ‹Π·ΠΎΠ²ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ сдСланы Π½Π° этапС компиляции. Π’ случаС ΠΌΡƒΠ»ΡŒΡ‚ΠΈΡ„Π°ΠΉΠ»ΠΎΠ²ΠΎΠ³ΠΎ программирования для этого Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² языка C .

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° - Π² языкС C , Ρ„Π°ΠΉΠ» содСрТащий ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ присоСдинСн ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π½Π° этапС Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ. ЀактичСски Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° это Π½Π°Π±ΠΎΡ€ особым ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ скомпонованных ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ².

НазначСниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ - ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ программисту стандартный ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎΠ³ΠΎ использования ΠΊΠΎΠ΄Π°, ΠΏΡ€ΠΈΡ‡Π΅ΠΌ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ простой ΠΈ Π½Π°Π΄Ρ‘ΠΆΠ½Ρ‹ΠΉ.

Π‘ Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π±Ρ‹Π²Π°ΡŽΡ‚ статичСскими ΠΈ раздСляСмыми (динамичСскими ).

Код статичСских Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² состав исполняСмого Ρ„Π°ΠΉΠ»Π° Π² Ρ…ΠΎΠ΄Π΅ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ послСднСго. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° оказываСтся "Π·Π°ΡˆΠΈΡ‚ΠΎΠΉ" Π² Ρ„Π°ΠΉΠ», ΠΊΠΎΠ΄ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ "сливаСтся" с ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹ΠΌ ΠΊΠΎΠ΄ΠΎΠΌ Ρ„Π°ΠΉΠ»Π°. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ статичСскиС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎΠΉ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° практичСски Π½Π° любом ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π΅ с подходящСй Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€ΠΎΠΉ ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой.

Код раздСляСмой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ загруТаСтся ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ ΠΊΠΎΠ΄Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмой, ΠΏΠΎ запросу ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² Ρ…ΠΎΠ΄Π΅ Π΅Ρ‘ исполнСния. Π’ состав исполняСмого Ρ„Π°ΠΉΠ»Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΊΠΎΠ΄ динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΡ‚, Π² исполняСмый Ρ„Π°ΠΉΠ» Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ссылка Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π°Ρ раздСляСмыС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ пСрСстаСт Π±Ρ‹Ρ‚ΡŒ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½ΠΎΠΉ ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² систСмС Π³Π΄Π΅ задСйствованныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ установлСны.

ΠŸΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΠ° раздСляСмых Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ прСдоставляСт Ρ‚Ρ€ΠΈ сущСствСнных прСимущСства:

1. ΠœΠ½ΠΎΠ³ΠΎΠΊΡ€Π°Ρ‚Π½ΠΎ сокращаСтся Ρ€Π°Π·ΠΌΠ΅Ρ€ исполняСмого Ρ„Π°ΠΉΠ»Π°. Π’ систСмС, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π΅ΠΉ мноТСство Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΠ΄, ΠΎΡ‚ΠΏΠ°Π΄Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ копию этого ΠΊΠΎΠ΄Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ исполняСмого Ρ„Π°ΠΉΠ»Π°.

2. Код раздСляСмой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ нСсколькими прилоТСниями Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти Π² ΠΎΠ΄Π½ΠΎΠΌ экзСмплярС (Π½Π° самом Π΄Π΅Π»Π΅ Π½Π΅ всё Ρ‚Π°ΠΊ просто...), Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ сокращаСтся ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ систСмы Π² доступной ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти.

3. ΠžΡ‚ΠΏΠ°Π΄Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΡΠΎΠ±ΠΈΡ€Π°Ρ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ» Π² случаС внСсСния ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ΄ ΠΎΠ±Ρ‰Π΅ΠΉ для Π½ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. ИзмСнСния ΠΈ исправлСния ΠΊΠΎΠ΄Π° динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ автоматичСски отразятся Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΠ· ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΡ… Π΅Ρ‘ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ.

Π‘Π΅Π· ΠΏΠ°Ρ€Π°Π΄ΠΈΠ³ΠΌΡ‹ раздСляСмых Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π½Π΅ сущСствовало Π±Ρ‹ ΠΏΡ€Π΅ΠΊΠΎΠΌΠΏΠΈΠ»Π»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… (Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ…) дистрибутивов Linux (Π΄Π° Π½ΠΈ ΠΊΠ°ΠΊΠΈΡ… Π±Ρ‹ Π½Π΅ сущСствовало). ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ дистрибутива, Π² ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ, Π±Ρ‹Π» Π±Ρ‹ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½ ΠΊΠΎΠ΄ стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ C (ΠΈ всСх Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ). Π’Π°ΠΊ ΠΆΠ΅ ΠΏΡ€Π΅Π΄ΡΡ‚Π°Π²ΡŒΡ‚Π΅ Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π±Ρ‹ Π΄Π΅Π»Π°Ρ‚ΡŒ для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒ систСму, послС устранСния критичСской уязвимости Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· ΡˆΠΈΡ€ΠΎΠΊΠΎ задСйствованных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ...

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠΈ.

Для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Π½Π°Π±ΠΎΡ€ΠΎΠΌ исходных Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅Π³ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π°. Π’ Π½Π°ΡˆΡƒ ΡΠ°ΠΌΠΎΠ΄Π΅Π»ΡŒΠ½ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ помСстим ΠΊΠΎΠ΄ (Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ first() ΠΈ second() .

Π’ Linux принята ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ схСма имСнования Ρ„Π°ΠΉΠ»ΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ (хотя ΡΠΎΠ±Π»ΡŽΠ΄Π°Π΅Ρ‚ΡΡ ΠΎΠ½Π° Π½Π΅ всСгда) - имя Ρ„Π°ΠΉΠ»Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ начинаСтся с прСфикса lib , Π·Π° Π½ΠΈΠΌ слСдуСт собствСнно имя Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π² ΠΊΠΎΠ½Ρ†Π΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ .a (archive ) - для статичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, .so (shared object ) - для раздСляСмой (динамичСской), послС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ Ρ‡Π΅Ρ€Π΅Π· Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ Ρ†ΠΈΡ„Ρ€Ρ‹ Π½ΠΎΠΌΠ΅Ρ€Π° вСрсии (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ). Имя, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° (ΠΎΠΏΡΡ‚ΡŒ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ), состоит ΠΈΠ· ΠΈΠΌΠ΅Π½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (Π±Π΅Π· прСфикса ΠΈ вСрсии) ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ .h . НапримСр: libogg.a , libogg.so.0.7.0 , ogg.h .

Π’ Π½Π°Ρ‡Π°Π»Π΅ создадим ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ first() ΠΈ second() составят содСрТимоС нашСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ libhello . Имя Ρ„Π°ΠΉΠ»Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, соотвСтствСнно, Π±ΡƒΠ΄Π΅Ρ‚ libhello.a . Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅ сопоставим Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» hello.h .

/* hello.h */

void first(void );
void second(void );

РазумССтся, строки:

#include "first.h"


#include "second.h"

Π² Ρ„Π°ΠΉΠ»Π°Ρ… main.c , first.c ΠΈ second.c Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π°:

#include "hello.h"

Ну Π° Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, Π²Π²Π΅Π΄Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄:

$ gcc -Wall -c first.c
$ gcc -Wall -c second.c
$ ar crs libhello.a first.o second.o
$ file libhello.a
libhello.a: current ar archive

Как ΡƒΠΆΠ΅ Π±Ρ‹Π»ΠΎ сказано - Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° это Π½Π°Π±ΠΎΡ€ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². ΠŸΠ΅Ρ€Π²Ρ‹ΠΌΠΈ двумя ΠΊΠΎΠΌΠ°Π½Π΄Π°ΠΌΠΈ ΠΌΡ‹ ΠΈ создали эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹.

Π”Π°Π»Π΅Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΡΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²Π°Ρ‚ΡŒ Π² Π½Π°Π±ΠΎΡ€. Для этого ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π°Ρ€Ρ…ΠΈΠ²Π°Ρ‚ΠΎΡ€ ar - ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° "склСиваСт" нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΎΠ΄ΠΈΠ½, Π² ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π°Ρ€Ρ…ΠΈΠ² Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ для восстановлСния (извлСчСния) ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΈΠ½Π΄ΠΈΠ²ΠΈΠ΄ΡƒΠ°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π΅Π³ΠΎ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Ρ‹ принадлСТности, доступа, Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ). Какого-Π»ΠΈΠ±ΠΎ "сТатия" содСрТимого Π°Ρ€Ρ…ΠΈΠ²Π° ΠΈΠ»ΠΈ ΠΈΠ½ΠΎΠ³ΠΎ прСобразования Ρ…Ρ€Π°Π½ΠΈΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΡ€ΠΈ этом Π½Π΅ производится.

ΠžΠΏΡ†ΠΈΡ c arname - ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π°Ρ€Ρ…ΠΈΠ², Ссли Π°Ρ€Ρ…ΠΈΠ² с ΠΈΠΌΠ΅Π½Π΅ΠΌ arname Π½Π΅ сущСствуСт ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ создан, Π² ΠΏΡ€ΠΎΡ‚ΠΈΠ²Π½ΠΎΠΌ случаС Ρ„Π°ΠΉΠ»Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½Ρ‹ ΠΊ ΠΈΠΌΠ΅ΡŽΡ‰Π΅ΠΌΡƒΡΡ Π°Ρ€Ρ…ΠΈΠ²Ρƒ.

ΠžΠΏΡ†ΠΈΡ r - Π·Π°Π΄Π°Π΅Ρ‚ Ρ€Π΅ΠΆΠΈΠΌ обновлСния Π°Ρ€Ρ…ΠΈΠ²Π°, Ссли Π² Π°Ρ€Ρ…ΠΈΠ²Π΅ Ρ„Π°ΠΉΠ» с ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ ΡƒΠΆΠ΅ сущСствуСт, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ΄Π°Π»Π΅Π½, Π° Π½ΠΎΠ²Ρ‹ΠΉ Ρ„Π°ΠΉΠ» дописан Π² ΠΊΠΎΠ½Π΅Ρ† Π°Ρ€Ρ…ΠΈΠ²Π°.

ΠžΠΏΡ†ΠΈΡ s - добавляСт (обновляСт) индСкс Π°Ρ€Ρ…ΠΈΠ²Π°. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС индСкс Π°Ρ€Ρ…ΠΈΠ²Π° это Ρ‚Π°Π±Π»ΠΈΡ†Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€ΡƒΠ΅ΠΌΡ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ… символичСского ΠΈΠΌΠ΅Π½ΠΈ (ΠΈΠΌΠ΅Π½ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠ° Π΄Π°Π½Π½Ρ‹Ρ…) сопоставлСно ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ Π΅ΠΌΡƒ имя ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. ИндСкс Π°Ρ€Ρ…ΠΈΠ²Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ для ускорСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ - для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π°ΠΉΡ‚ΠΈ Π½ΡƒΠΆΠ½ΠΎΠ΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅, ΠΎΡ‚ΠΏΠ°Π΄Π°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ символов всСх Ρ„Π°ΠΉΠ»ΠΎΠ² Π°Ρ€Ρ…ΠΈΠ²Π°, ΠΌΠΎΠΆΠ½ΠΎ сразу ΠΏΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ, содСрТащСму искомоС имя. ΠŸΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ индСкс Π°Ρ€Ρ…ΠΈΠ²Π° ΠΌΠΎΠΆΠ½ΠΎ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΠΎΠΉ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ nm воспользовавшись Π΅Ρ‘ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ -s (Ρ‚Π°ΠΊ ΠΆΠ΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ‹ Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ символов всСх ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Π°Ρ€Ρ…ΠΈΠ²Π°):

$ nm -s libhello.a
Archive index:
first in first.o
second in second.o

first.o:
00000000 T first
U puts

second.o:
U puts
00000000 T second

Для создания индСкса Π°Ρ€Ρ…ΠΈΠ²Π° сущСствуСт ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Π°Ρ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ranlib . Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ libhello.a ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΡΠΎΡ‚Π²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΈ Ρ‚Π°ΠΊ:

$ ar cr libhello.a first.o second.o
$ ranlib libhello.a

Π’ΠΏΡ€ΠΎΡ‡Π΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ прСкрасно Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈ Π±Π΅Π· индСкса Π°Ρ€Ρ…ΠΈΠ²Π°.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ нашСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ:

$ gcc -Wall -c main.c
$
$ ./main
First function...
Second function...
Main function...

Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚...

Ну Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ... Появились Π΄Π²Π΅ Π½ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΡ†ΠΈΠΈ gcc :

ΠžΠΏΡ†ΠΈΡ -l name - пСрСдаётся Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΡƒ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊ исполняСмому Ρ„Π°ΠΉΠ»Ρƒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ libname . ΠŸΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΈΠ΅-Ρ‚ΠΎ ΠΈ Ρ‚Π°ΠΊΠΈΠ΅-Ρ‚ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ (внСшниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅) ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Ρ‹ Π² Ρ‚Π°ΠΊΠΎΠΉ-Ρ‚ΠΎ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅. Π’ нашСм ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° статичСская, всС ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Π΅ ΠΈΠΌΠ΅Π½Π° Π±ΡƒΠ΄ΡƒΡ‚ ΡΡΡ‹Π»Π°Ρ‚ΡŒΡΡ Π½Π° ΠΊΠΎΠ΄ находящийся нСпосрСдствСнно Π² исполняСмом Ρ„Π°ΠΉΠ»Π΅. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π² ΠΎΠΏΡ†ΠΈΠΈ -l имя Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ задаСтся ΠΊΠ°ΠΊ name Π±Π΅Π· приставки lib .

ΠžΠΏΡ†ΠΈΡ -L /ΠΏΡƒΡ‚ΡŒ/ΠΊ/ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ/с/Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ - пСрСдаётся Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΡƒ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ содСрТащСму ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π’ нашСм случаС Π·Π°Π΄Π°Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° . , Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ сначала Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π² Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅, Π·Π°Ρ‚Π΅ΠΌ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Π² систСмС.

Π—Π΄Π΅ΡΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ нСбольшоС Π·Π°ΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для ряда ΠΎΠΏΡ†ΠΈΠΉ gcc Π²Π°ΠΆΠ΅Π½ порядок ΠΈΡ… слСдования Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС. Π’Π°ΠΊ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ ΠΈΡ‰Π΅Ρ‚ ΠΊΠΎΠ΄, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹ΠΌ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π΅ символов Ρ„Π°ΠΉΠ»Π° ΠΈΠΌΠ΅Π½Π°ΠΌ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ…, пСрСчислСнных Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС послС ΠΈΠΌΠ΅Π½ΠΈ этого Ρ„Π°ΠΉΠ»Π°. Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠΈΠΌΠΎΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ пСрСчислСнных Π΄ΠΎ ΠΈΠΌΠ΅Π½ΠΈ Ρ„Π°ΠΉΠ»Π° Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΠ΅Ρ‚:

$ gcc -Wall -c main.c
$ gcc -o main -L. -lhello main.o
main.o: In function `main":
main.c:(.text+0xa): undefined reference to `first"
main.c:(.text+0xf): undefined reference to `second"

$ gcc -o main main.o -L. -lhello
$ ./main
First function...
Second function...
Main function...

Вакая ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ повСдСния gcc обусловлСна ΠΆΠ΅Π»Π°Π½ΠΈΠ΅ΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎ Ρ€Π°Π·Π½ΠΎΠΌΡƒ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ с Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΡΠ΅ΠΊΠ°ΡŽΡ‰ΠΈΠ΅ ΠΈΠΌΠ΅Π½Π°... На ΠΌΠΎΠΉ взгляд, Ссли Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π»ΡƒΡ‡ΡˆΠ΅ этим Π½Π΅ Π·Π°ΠΌΠΎΡ€Π°Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ. Π’ ΠΎΠ±Ρ‰Π΅ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅ΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»ΡΡ‚ΡŒ послС ΠΈΠΌΠ΅Π½ΠΈ ΡΡΡ‹Π»Π°ΡŽΡ‰Π΅Π³ΠΎΡΡ Π½Π° Π½ΠΈΡ… Ρ„Π°ΠΉΠ»Π°.

БущСствуСт Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ способ указания мСстополоТСния Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π² систСмС. Π’ зависимости ΠΎΡ‚ дистрибутива, пСрСмСнная окруТСния LD_LIBRARY_PATH ΠΈΠ»ΠΈ LIBRARY_PATH ΠΌΠΎΠΆΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ список Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… Π·Π½Π°ΠΊΠΎΠΌ двоСточия ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Как ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ эта пСрСмСнная Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π°, Π½ΠΎ Π½ΠΈ Ρ‡Π΅Π³ΠΎ Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ Π΅Ρ‘ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ:

$ echo $LD_LIBRARY_PATH

/usr/lib/gcc/i686-pc-linux-gnu/4.4.3/../../../../i686-pc-linux-gnu/bin/ld: cannot find -lhello
collect2: Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ld Π·Π°Π²Π΅Ρ€ΡˆΠΈΠ»ΠΎΡΡŒ с ΠΊΠΎΠ΄ΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° 1
$ export LIBRARY_PATH=.
$ gcc -o main main.o -lhello
$ ./main
First function...
Second function...
Main function...

ΠœΠ°Π½ΠΈΠΏΡƒΠ»ΡΡ†ΠΈΠΈ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ окруТСния ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ ΠΏΡ€ΠΈ создании ΠΈ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅ собствСнных Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Π° Ρ‚Π°ΠΊ ΠΆΠ΅ Ссли Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΊΠ°ΠΊΡƒΡŽ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ Π½Π΅ΡΡ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½ΡƒΡŽ (ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΡƒΡŽ, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π½ΡƒΡŽ, ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½ΡƒΡŽ - Π² ΠΎΠ±Ρ‰Π΅ΠΌ ΠΎΡ‚Π»ΠΈΡ‡Π½ΡƒΡŽ ΠΎΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ Π² дистрибутив) Ρ€Π°Π·Π΄Π΅Π»ΡΠ΅ΠΌΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ создадим ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π΄ΠΈΠ½Π°ΠΌΠΈΡ‡Π΅ΡΠΊΡƒΡŽ.

Набор исходных Ρ„Π°ΠΉΠ»ΠΎΠ² остаСтся Π±Π΅Π· измСнСния. Π’Π²ΠΎΠ΄ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, смотрим Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, Ρ‡ΠΈΡ‚Π°Π΅ΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ:

$ gcc -Wall -fPIC -c first.c
$ gcc -Wall -fPIC -c second.c
$ gcc -shared -o libhello.so.2.4.0.5 -Wl,-soname,libhello.so.2 first.o second.o

Π§Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅?

$ file libhello.so.2.4.0.5
libhello.so.2.4.0.5: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped

Π€Π°ΠΉΠ» libhello.so.2.4.0.5 , это ΠΈ Π΅ΡΡ‚ΡŒ наша раздСляСмая Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°. Как Π΅Ρ‘ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Ρ‡ΡƒΡ‚ΡŒ Π½ΠΈΠΆΠ΅.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ:

ΠžΠΏΡ†ΠΈΡ -fPIC - Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ ΠΎΡ‚ компилятора, ΠΏΡ€ΠΈ создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΏΠΎΡ€ΠΎΠΆΠ΄Π°Ρ‚ΡŒ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ-нСзависимый ΠΊΠΎΠ΄ (PIC - Position Independent Code ), Π΅Π³ΠΎ основноС ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠ΅ Π² способС прСдставлСния адрСсов. ВмСсто указания фиксированных (статичСских) ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΉ, всС адрСса Π²Ρ‹Ρ‡ΠΈΡΠ»ΡΡŽΡ‚ΡΡ исходя ΠΈΠ· смСщСний Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π² глобальной Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ смСщСний (global offset table - GOT ). Π€ΠΎΡ€ΠΌΠ°Ρ‚ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ-нСзависимого ΠΊΠΎΠ΄Π° позволяСт ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ исполняСмыС ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΊ ΠΊΠΎΠ΄Ρƒ основной ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π΅Ρ‘ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. БоотвСтствСнно, основноС Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½Π½ΠΎ-нСзависимого ΠΊΠΎΠ΄Π° - созданиС динамичСских (раздСляСмых) Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ.

ΠžΠΏΡ†ΠΈΡ -shared - ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ gcc , Ρ‡Ρ‚ΠΎ Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ собран Π½Π΅ исполняСмый Ρ„Π°ΠΉΠ», Π° раздСляСмый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ - динамичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°.

ΠžΠΏΡ†ΠΈΡ -Wl,-soname,libhello.so.2 - Π·Π°Π΄Π°Π΅Ρ‚ soname Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. О soname ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ Π°Π±Π·Π°Ρ†Π΅. БСйчас обсудим Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠΎΠΏΡ†ΠΈΠΈ. БСя странная, Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ взгляд, конструкция с запятыми ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для нСпосрСдствСнного взаимодСйствия ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ с Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΠΎΠΌ. По Ρ…ΠΎΠ΄Ρƒ компиляции gcc Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ автоматичСски, автоматичСски ΠΆΠ΅, ΠΏΠΎ собствСнному ΡƒΡΠΌΠΎΡ‚Ρ€Π΅Π½ΠΈΡŽ, gcc ΠΏΠ΅Ρ€Π΅Π΄Π°Π΅Ρ‚ Π΅ΠΌΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ задания ΠΎΠΏΡ†ΠΈΠΈ. Если Ρƒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½ΠΎΡΡ‚ΡŒ самому Π²ΠΌΠ΅ΡˆΠ°Ρ‚ΡŒΡΡ Π² процСсс Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠ΅ΠΉ gcc -Wl, -option , value1 , value2 ... . Π§Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΡƒ (-Wl ) ΠΎΠΏΡ†ΠΈΡŽ -option с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ value1 , value2 ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅. Π’ нашСм случаС Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΡƒ Π±Ρ‹Π»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° опция -soname с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ libhello.so.2 .

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎ soname. ΠŸΡ€ΠΈ создании ΠΈ распространСнии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ встаСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° совмСстимости ΠΈ контроля вСрсий. Для Ρ‚ΠΎΠ³ΠΎ Ρ‡Ρ‚ΠΎΠ±Ρ‹ систСма, ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ динамичСских Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΈΠΌΠ΅Π»ΠΈ прСдставлСниС ΠΎ Ρ‚ΠΎΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΊΠ°ΠΊΠΎΠΉ вСрсии Π±Ρ‹Π»Π° использована ΠΏΡ€ΠΈ компиляции прилоТСния ΠΈ, соотвСтствСнно, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° для Π΅Π³ΠΎ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ функционирования, Π±Ρ‹Π» прСдусмотрСн ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ - soname , ΠΏΠΎΠΌΠ΅Ρ‰Π°Π΅ΠΌΡ‹ΠΉ ΠΊΠ°ΠΊ Π² Ρ„Π°ΠΉΠ» самой Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Ρ‚Π°ΠΊ ΠΈ Π² исполняСмый Ρ„Π°ΠΉΠ» прилоТСния. Π˜Π΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ soname это строка, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π°Ρ имя Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ с прСфиксом lib , Ρ‚ΠΎΡ‡ΠΊΡƒ, Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ so , снова Ρ‚ΠΎΡ‡ΠΊΡƒ ΠΈ ΠΎΠ΄Ρƒ ΠΈΠ»ΠΈ Π΄Π²Π΅ (Ρ€Π°Π·Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ) Ρ†ΠΈΡ„Ρ€Ρ‹ вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ - lib name .so. x . y . Π’ΠΎ Π΅ΡΡ‚ΡŒ soname совпадаСт с ΠΈΠΌΠ΅Π½Π΅ΠΌ Ρ„Π°ΠΉΠ»Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π²ΠΏΠ»ΠΎΡ‚ΡŒ Π΄ΠΎ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΈΠ»ΠΈ Π²Ρ‚ΠΎΡ€ΠΎΠΉ Ρ†ΠΈΡ„Ρ€Ρ‹ Π½ΠΎΠΌΠ΅Ρ€Π° вСрсии. ΠŸΡƒΡΡ‚ΡŒ имя исполняСмого Ρ„Π°ΠΉΠ»Π° нашСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ libhello.so.2.4.0.5 , Ρ‚ΠΎΠ³Π΄Π° soname Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ libhello.so.2 . ΠŸΡ€ΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΈ интСрфСйса Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π΅Ρ‘ soname Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ! Π›ΡŽΠ±Π°Ρ модификация ΠΊΠΎΠ΄Π°, приводящая ΠΊ нСсовмСстимости с ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠΌΠΈ Ρ€Π΅Π»ΠΈΠ·Π°ΠΌΠΈ Π΄ΠΎΠ»ΠΆΠ½Π° ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°Ρ‚ΡŒΡΡ появлСниСм Π½ΠΎΠ²ΠΎΠ³ΠΎ soname.

Как ΠΆΠ΅ это всС Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚? ΠŸΡƒΡΡ‚ΡŒ для ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ³ΠΎ исполнСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ прилоТСния Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° с ΠΈΠΌΠ΅Π½Π΅ΠΌ hello , ΠΏΡƒΡΡ‚ΡŒ Π² систСмС таковая имССтся, ΠΏΡ€ΠΈ этом имя Ρ„Π°ΠΉΠ»Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ libhello.so.2.4.0.5 , Π° прописанноС Π² Π½Π΅ΠΌ soname Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ libhello.so.2 . На этапС компиляции прилоТСния, Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ, Π² соотвСтствии с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ -l hello , Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Π² систСмС Ρ„Π°ΠΉΠ» с ΠΈΠΌΠ΅Π½Π΅ΠΌ libhello.so . Π’ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ систСмС libhello.so это символичСская ссылка Π½Π° Ρ„Π°ΠΉΠ» libhello.so.2.4.0.5 . ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠ² доступ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ считаСт прописанноС Π² Π½Π΅ΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ soname ΠΈ наряду с ΠΏΡ€ΠΎΡ‡ΠΈΠΌ помСстит Π΅Π³ΠΎ Π² исполняСмый Ρ„Π°ΠΉΠ» прилоТСния. Когда ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°ΠΏΡƒΡ‰Π΅Π½ΠΎ, Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ динамичСских Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ запрос Π½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ с soname, считанным ΠΈΠ· исполняСмого Ρ„Π°ΠΉΠ»Π°, ΠΈ попытаСтся Π½Π°ΠΉΡ‚ΠΈ Π² систСмС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, имя Ρ„Π°ΠΉΠ»Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ совпадаСт с soname. Π’ΠΎ Π΅ΡΡ‚ΡŒ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ попытаСтся ΠΎΡ‚Ρ‹ΡΠΊΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» libhello.so.2 . Если систСма настроСна ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎ, Π² Π½Π΅ΠΉ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ символичСская ссылка libhello.so.2 Π½Π° Ρ„Π°ΠΉΠ» libhello.so.2.4.0.5 , Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ доступ ΠΊ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Π΄Π°Π»Π΅Π΅ Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡΡΡŒ (ΠΈ Π½ΠΈ Ρ‡Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ Π½Π΅ провСряя) ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ Π΅Ρ‘ ΠΊ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ прСдставим, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ пСрСнСсли ΠΎΡ‚ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ΅ Ρ‚Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π΄Ρ€ΡƒΠ³ΡƒΡŽ систСму, Π³Π΄Π΅ Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прСдыдущая вСрсия Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ с soname libhello.so.1 . ΠŸΠΎΠΏΡ‹Ρ‚ΠΊΠ° Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ ошибкС, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π² этой систСмС Ρ„Π°ΠΉΠ»Π° с ΠΈΠΌΠ΅Π½Π΅ΠΌ libhello.so.2 Π½Π΅Ρ‚.

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π½Π° этапС компиляции Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΡƒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Ρ„Π°ΠΉΠ» Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (ΠΈΠ»ΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ссылку Π½Π° Ρ„Π°ΠΉΠ» Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ) с ΠΈΠΌΠ΅Π½Π΅ΠΌ lib name .so , Π½Π° этапС исполнСния Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΡƒ потрСбуСтся Ρ„Π°ΠΉΠ» (ΠΈΠ»ΠΈ символичСская ссылка) с ΠΈΠΌΠ΅Π½Π΅ΠΌ lib name .so. x . y . ΠŸΡ€ΠΈ Ρ‡Π΅ΠΌ имя lib name .so. x . y Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°Ρ‚ΡŒ со строкой soname использованной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.

Π’ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… дистрибутивах, ΠΊΠ°ΠΊ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎ, Ρ„Π°ΠΉΠ» Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ libhello.so.2.4.0.5 ΠΈ ссылка Π½Π° Π½Π΅Π³ΠΎ libhello.so.2 Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² ΠΏΠ°ΠΊΠ΅Ρ‚ libhello , Π° нСобходимая Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для компиляции ссылка libhello.so , вмСстС с Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ hello.h Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π° Π² ΠΏΠ°ΠΊΠ΅Ρ‚ libhello-devel (Π² devel ΠΏΠ°ΠΊΠ΅Ρ‚Π΅ окаТСтся ΠΈ Ρ„Π°ΠΉΠ» статичСской вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ libhello.a , статичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ использована, Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° этапС компиляции). ΠŸΡ€ΠΈ распаковкС ΠΏΠ°ΠΊΠ΅Ρ‚Π° всС пСрСчислСнныС Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ ссылки (ΠΊΡ€ΠΎΠΌΠ΅ hello.h ) окаТутся Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅.

УбСдимся, Ρ‡Ρ‚ΠΎ заданная строка soname Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ прописана Π² Ρ„Π°ΠΉΠ»Π΅ нашСй Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π’ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ ΠΌΠ΅Π³Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ objdump с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ -p :

$ objdump -p libhello.so.2.4.0.5 | grep SONAME
SONAME libhello.so.2


Π£Ρ‚ΠΈΠ»ΠΈΡ‚Π° objdump - ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΠΈΡΡ‡Π΅Ρ€ΠΏΡ‹Π²Π°ΡŽΡ‰ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½Π΅ΠΌ содСрТании (ΠΈ устройствС) ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ³ΠΎ ΠΈΠ»ΠΈ исполняСмого Ρ„Π°ΠΉΠ»Π°. Π’ man страницС ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ сказано, Ρ‡Ρ‚ΠΎ objdump ΠΏΡ€Π΅ΠΆΠ΄Π΅ всСго Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠΎΠ»Π΅Π·Π΅Π½ программистам, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠΌΠΈ срСдства ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈ компиляции, Π° Π½Π΅ просто ΠΏΠΈΡˆΡƒΡ‰ΠΈΡ… ΠΊΠ°ΠΊΠΈΠ΅-Π½ΠΈΠ±ΡƒΠ΄ΡŒ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:) Π’ частности с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ -d это дизассСмблСр. ΠœΡ‹ воспользовались ΠΎΠΏΡ†ΠΈΠ΅ΠΉ -p - вывСсти Ρ€Π°Π·Π»ΠΈΡ‡Π½ΡƒΡŽ ΠΌΠ΅Ρ‚Π°ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅.

Π’ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ создания Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΌΡ‹ нСотступно слСдовали ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ°ΠΌ Ρ€Π°Π·Π΄Π΅Π»ΡŒΠ½ΠΎΠΉ компиляции. РазумССтся ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈ Π²ΠΎΡ‚ Ρ‚Π°ΠΊ, ΠΎΠ΄Π½ΠΈΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ gcc :

$ gcc -shared -Wall -fPIC -o libhello.so.2.4.0.5 -Wl,-soname,libhello.so.2 first.c second.c

Π’Π΅ΠΏΠ΅Ρ€ΡŒ попытаСмся Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅ΠΉΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ:

$ gcc -Wall -c main.c
$
/usr/bin/ld: cannot find -lhello
collect2: ld returned 1 exit status

Π›ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ ругаСтся. ВспоминаСм, Ρ‡Ρ‚ΠΎ Π±Ρ‹Π»ΠΎ сказано Π²Ρ‹ΡˆΠ΅ ΠΎ символичСских ссылках. Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ libhello.so ΠΈ повторяСм ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΡƒ:

$ ln -s libhello.so.2.4.0.5 libhello.so
$ gcc -o main main.o -L. -lhello -Wl,-rpath,.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ всС Π΄ΠΎΠ²ΠΎΠ»ΡŒΠ½Ρ‹. ЗапускаСм созданный Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ:

Ошибка... РугаСтся Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π°ΠΉΡ‚ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ libhello.so.2 . УбСдимся, Ρ‡Ρ‚ΠΎ Π² исполняСмом Ρ„Π°ΠΉΠ»Π΅ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ прописана ссылка Π½Π° libhello.so.2 :

$ objdump -p main | grep NEEDED
NEEDED libhello.so.2
NEEDED libc.so.6

$ ln -s libhello.so.2.4.0.5 libhello.so.2
$ ./main
First function...
Second function...
Main function...

Π—Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ... Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΏΠΎ Π½ΠΎΠ²Ρ‹ΠΌ опциям gcc .

ΠžΠΏΡ†ΠΈΡ -Wl,-rpath,. - ΡƒΠΆΠ΅ знакомая конструкция, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΡƒ ΠΎΠΏΡ†ΠΈΡŽ -rpath с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠΌ . . Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ -rpath Π² исполняСмый Ρ„Π°ΠΉΠ» ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΎΠΏΠΈΡΠ°Ρ‚ΡŒ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡƒΡ‚ΠΈ ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ раздСляСмых Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚ΡŒ поиск Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ². Π’ нашСм случаС прописан ΠΏΡƒΡ‚ΡŒ . - поиск Ρ„Π°ΠΉΠ»ΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒΡΡ с Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°.

$ objdump -p main | grep RPATH
RPATH .

Благодаря ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ ΠΎΠΏΡ†ΠΈΠΈ, ΠΏΡ€ΠΈ запускС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΎΡ‚ΠΏΠ°Π»Π° Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ окруТСния. ΠŸΠΎΠ½ΡΡ‚Π½ΠΎ, Ρ‡Ρ‚ΠΎ Ссли пСрСнСсти ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π² Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ, Ρ„Π°ΠΉΠ» Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ ΠΈ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ выдаст сообщСниС ΠΎΠ± ошибкС:

$ mv main ..
$ ../main
First function...
Second function...
Main function...

Π£Π·Π½Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅ раздСляСмыС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ldd :

$ ldd main
linux-vdso.so.1 => (0x00007fffaddff000)
libhello.so.2 => ./libhello.so.2 (0x00007f9689001000)
libc.so.6 => /lib/libc.so.6 (0x00007f9688c62000)
/lib64/ld-linux-x86-64.so.2 (0x00007f9689205000)

Π’ Π²Ρ‹Π²ΠΎΠ΄Π΅ ldd для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ указываСтся Π΅Ρ‘ soname ΠΈ ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½Π½Ρ‹ΠΉ Π² соотвСтствии с настройками систСмы.

БСйчас самоС врСмя ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ ΠΎ Ρ‚ΠΎΠΌ Π³Π΄Π΅ Π² систСмС ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Π³Π΄Π΅ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ пытаСтся ΠΈΡ… Π½Π°ΠΉΡ‚ΠΈ ΠΈ ΠΊΠ°ΠΊ этим процСссом ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ.

Π’ соотвСтствии с соглашСниями FHS (Filesystem Hierarchy Standard) Π² систСмС Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π΄Π²Π° (ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ) ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° для хранСния Ρ„Π°ΠΉΠ»ΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ:

/lib - здСсь собраны основныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ дистрибутива, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ ΠΈΠ· /bin ΠΈ /sbin ;

/usr/lib - здСсь хранятся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Π΅ ΠΏΡ€ΠΈΠΊΠ»Π°Π΄Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°ΠΌ ΠΈΠ· /usr/bin ΠΈ /usr/sbin ;

Π‘ΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ /usr/include .

Π—Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΊΠ°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π² этих ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ….

ΠšΡ€ΠΎΠΌΠ΅ пСрСчислСнных Π²Ρ‹ΡˆΠ΅, Π² систСмС Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΏΡ€ΠΈΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /usr/local/lib - здСсь Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒΡΡ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, Ρ€Π°Π·Π²Π΅Ρ€Π½ΡƒΡ‚Ρ‹Π΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ, минуя систСму управлСния ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ (Π½Π΅ входящиС Π² состав дистрибутива). НапримСр Π² этом ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ окаТутся Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ скомпилированныС ΠΈΠ· исходников (ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ установлСнныС ΠΈΠ· исходников Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² /usr/local/bin ΠΈ /usr/local/sbin , разумССтся Ρ€Π΅Ρ‡ΡŒ ΠΈΠ΄Π΅Ρ‚ ΠΎ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… дистрибутивах). Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π² этом случаС Π±ΡƒΠ΄ΡƒΡ‚ ΠΏΠΎΠΌΠ΅Ρ‰Π΅Π½Ρ‹ Π² /usr/local/include .

Π’ рядС дистрибутивов (Π² Ubuntu ) Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ Π½Π΅ настроСн ΠΏΡ€ΠΎΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ /usr/local/lib , соотвСтствСнно, Ссли ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ установит Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΈΠ· исходников, систСма Π΅Ρ‘ Π½Π΅ ΡƒΠ²ΠΈΠ΄ΠΈΡ‚. Π‘ΠΈΡ‘ Π°Π²Ρ‚ΠΎΡ€Π°ΠΌΠΈ дистрибутива сдСлано ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ Π±Ρ‹ ΠΏΡ€ΠΈΡƒΡ‡ΠΈΡ‚ΡŒ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ ΡƒΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ΅ обСспСчСниС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Π΅Ρ€Π΅Π· систСму управлСния ΠΏΠ°ΠΊΠ΅Ρ‚Π°ΠΌΠΈ. Как ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ Π² Π΄Π°Π½Π½ΠΎΠΌ случаС Π±ΡƒΠ΄Π΅Ρ‚ рассказано Π½ΠΈΠΆΠ΅.

Π’ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, для упрощСния ΠΈ ускорСния процСсса поиска Ρ„Π°ΠΉΠ»ΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ Π½Π΅ просматриваСт ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠΈ ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ Π²Ρ‹ΡˆΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, Π° ΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π±Π°Π·ΠΎΠΉ Π΄Π°Π½Π½Ρ‹Ρ…, хранящСйся Π² Ρ„Π°ΠΉΠ»Π΅ /etc/ld.so.cache (кэшСм Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ). Π—Π΄Π΅ΡΡŒ собрана информация ΠΎ Ρ‚ΠΎΠΌ, Π³Π΄Π΅ Π² систСмС находится ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π΄Π°Π½Π½ΠΎΠΌΡƒ soname Ρ„Π°ΠΉΠ» Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Π—Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² список Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ (список soname Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Π² исполняСмом Ρ„Π°ΠΉΠ»Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹), посрСдством /etc/ld.so.cache опрСдСляСт ΠΏΡƒΡ‚ΡŒ ΠΊ Ρ„Π°ΠΉΠ»Ρƒ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π΅Ρ‘ Π² ΠΏΠ°ΠΌΡΡ‚ΡŒ. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ пСрСчислСнныС Π² систСмных ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… LD_LIBRARY_PATH , LIBRARY_PATH ΠΈ Π² ΠΏΠΎΠ»Π΅ RPATH исполняСмого Ρ„Π°ΠΉΠ»Π° (смотри Π²Ρ‹ΡˆΠ΅).

Для управлСния ΠΈ поддСрТания Π² Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΌ состоянии кэша Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ldconfig . Если Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ldconfig Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΎΠΏΡ†ΠΈΠΉ, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° просмотрит ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ Π² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строкС, Π΄ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ /lib ΠΈ /usr/lib , ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ пСрСчислСнныС Π² Ρ„Π°ΠΉΠ»Π΅ /etc/ld.so.conf . Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, оказавшСгося Π² ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Ρ… ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…, Π±ΡƒΠ΄Π΅Ρ‚ считано soname, создана основанная Π½Π° soname символичСская ссылка, ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½Π° информация Π² /etc/ld.so.cache .

УбСдимся в сказанном:

$ ls
hello.h libhello.so libhello.so.2.4.0.5 main.c
$
$ sudo ldconfig /ΠΏΠΎΠ»Π½Ρ‹ΠΉ/ΠΏΡƒΡ‚ΡŒ/ΠΊ/ΠΊΠ°Ρ‚Π°ΠΎΠ³Ρƒ/c/ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ
$ ls
hello.h libhello.so libhello.so.2 libhello.so.2.4.0.5 main main.c
$ ./main
First function...
Second function...
Main function...

ΠŸΠ΅Ρ€Π²Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ldconfig ΠΌΡ‹ внСсли Π² кэш Π½Π°ΡˆΡƒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, Π²Ρ‚ΠΎΡ€Ρ‹ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΎΠΌ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΠ»ΠΈ. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ компиляции main Π±Ρ‹Π»Π° ΠΎΠΏΡƒΡ‰Π΅Π½Π° опция -Wl,-rpath,. , Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΠ» поиск Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² кэшС.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ понятно ΠΊΠ°ΠΊ ΠΏΠΎΡΡ‚ΡƒΠΏΠΈΡ‚ΡŒ Ссли послС установки Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ· исходников систСма Π΅Ρ‘ Π½Π΅ Π²ΠΈΠ΄ΠΈΡ‚. ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ внСсти Π² Ρ„Π°ΠΉΠ» /etc/ld.so.conf ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΏΡƒΡ‚ΡŒ ΠΊ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Ρƒ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ /usr/local/lib ). Π€ΠΎΡ€ΠΌΠ°Ρ‚ /etc/ld.so.conf - Ρ„Π°ΠΉΠ» содСрТит список Ρ€Π°Π·Π΄Π΅Π»Ρ‘Π½Π½Ρ‹Ρ… Π΄Π²ΠΎΠ΅Ρ‚ΠΎΡ‡ΠΈΠ΅ΠΌ, ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠΌ, табуляциСй ΠΈΠ»ΠΈ символом Π½ΠΎΠ²ΠΎΠΉ строки, ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… производится поиск Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. ПослС Ρ‡Π΅Π³ΠΎ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ ldconfig Π±Π΅Π· ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ ΠΎΠΏΡ†ΠΈΠΉ, Π½ΠΎ с ΠΏΡ€Π°Π²Π°ΠΌΠΈ ΡΡƒΠΏΠ΅Ρ€ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Всё Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ.

Ну ΠΈ Π² ΠΊΠΎΠ½Ρ†Π΅ ΠΏΠΎΠ³ΠΎΠ²ΠΎΡ€ΠΈΠΌ ΠΎ Ρ‚ΠΎΠΌ ΠΊΠ°ΠΊ ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ вмСстС статичСскиС ΠΈ динамичСскиС вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. Π’ Ρ‡Π΅ΠΌ собствСнно вопрос? Π’Ρ‹ΡˆΠ΅, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»ΠΈΡΡŒ принятыС ΠΈΠΌΠ΅Π½Π° ΠΈ располоТСниС Ρ„Π°ΠΉΠ»ΠΎΠ² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π±Ρ‹Π»ΠΎ сказано, Ρ‡Ρ‚ΠΎ Ρ„Π°ΠΉΠ»Ρ‹ статичСской ΠΈ динамичСской вСрсий Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ хранятся Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅. Как ΠΆΠ΅ gcc ΡƒΠ·Π½Π°Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ Ρ‚ΠΈΠΏ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ? По ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚Π΅Π½ΠΈΠ΅ отдаСтся динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ. Если Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ„Π°ΠΉΠ» динамичСской Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΎΠ½ Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡΡΡŒ цСпляСт Π΅Π³ΠΎ ΠΊ исполняСмому Ρ„Π°ΠΉΠ»Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹:

$ ls
hello.h libhello.a libhello.so libhello.so.2 libhello.so.2.4.0.5 main.c
$ gcc -Wall -c main.c
$ gcc -o main main.o -L. -lhello -Wl,-rpath,.
$ ldd main
linux-vdso.so.1 => (0x00007fffe1bb0000)
libhello.so.2 => ./libhello.so.2 (0x00007fd50370b000)
libc.so.6 => /lib/libc.so.6 (0x00007fd50336c000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd50390f000)
$ du -h main
12K main

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ исполняСмого Ρ„Π°ΠΉΠ»Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Он минимально Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ. ВсС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Π»ΠΈΠ½ΠΊΡƒΡŽΡ‚ΡΡ динамичСски.

БущСствуСт опция gcc -static - ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅ Π»ΠΈΠ½ΠΊΠΎΠ²Ρ‰ΠΈΠΊΡƒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ статичСскиС вСрсии всСх Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹Ρ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ:

$ gcc -static -o main main.o -L. -lhello
$ file main
main: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.15, not stripped
$ ldd main
Π½Π΅ являСтся динамичСским исполняСмым Ρ„Π°ΠΉΠ»ΠΎΠΌ
$ du -h main
728K main

Π Π°Π·ΠΌΠ΅Ρ€ исполняСмого Ρ„Π°ΠΉΠ»Π° Π² 60 Ρ€Π°Π· большС, Ρ‡Π΅ΠΌ Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ - Π² Ρ„Π°ΠΉΠ» Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ стандартныС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ языка C . Π’Π΅ΠΏΠ΅Ρ€ΡŒ нашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ смСло ΠΏΠ΅Ρ€Π΅Π½ΠΎΡΠΈΡ‚ΡŒ ΠΈΠ· ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ ΠΈ Π΄Π°ΠΆΠ΅ Π½Π° Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ΠΌΠ°ΡˆΠΈΠ½Ρ‹, ΠΊΠΎΠ΄ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ hello Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Π°ΠΉΠ»Π°, ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Π°.

Как ΠΆΠ΅ Π±Ρ‹Ρ‚ΡŒ Ссли Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΈΡ‚ΡŒ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΡƒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ части ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ? Π’ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ - ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ имя статичСской вСрсии Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΎΡ‚ ΠΈΠΌΠ΅Π½ΠΈ раздСляСмой, Π° ΠΏΡ€ΠΈ компиляции прилоТСния ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π½Π° этот Ρ€Π°Π·:

$ mv libhello.a libhello_s.a
$ gcc -o main main.o -L. -lhello_s
$ ldd main
linux-vdso.so.1 => (0x00007fff021f5000)
libc.so.6 => /lib/libc.so.6 (0x00007fd0d0803000)
/lib64/ld-linux-x86-64.so.2 (0x00007fd0d0ba4000)
$ du -h main
12K main

Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΠ΄Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ libhello Π½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½,

$ du -h libhello_s.a
4,0K libhello.a

Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ²ΡˆΠ΅Π³ΠΎΡΡ исполняСмого Ρ„Π°ΠΉΠ»Π° практичСски Π½Π΅ отличаСтся ΠΎΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»Π° созданного с использованиСм динамичСской Π»ΠΈΠ½ΠΊΠΎΠ²ΠΊΠΈ.

Ну Π²ΠΎΡ‚ ΠΏΠΎΠΆΠ°Π»ΡƒΠΉ ΠΈ всС. Π‘ΠΎΠ»ΡŒΡˆΠΎΠ΅ спасибо всСм, ΠΊΡ‚ΠΎ Π·Π°ΠΊΠΎΠ½Ρ‡ΠΈΠ» Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ Π½Π° этом мСстС.

gcc (GNU C Compiler) - Π½Π°Π±ΠΎΡ€ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ для компиляции, ассСмблирования ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΠΊΠΈ. Π˜Ρ… Ρ†Π΅Π»ΡŒΡŽ являСтся созданиС Π³ΠΎΡ‚ΠΎΠ²ΠΎΠ³ΠΎ ΠΊ запуску исполняСмого Ρ„Π°ΠΉΠ»Π° Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅, ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΌ вашСй ОБ. Для Linux, этим Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ являСтся ELF (Executable and Linking Format) Π½Π° x86 (32- ΠΈ 64-Π±ΠΈΡ‚Π½Ρ‹Ρ…). Но Π·Π½Π°Π΅Ρ‚Π΅ Π»ΠΈ Π²Ρ‹, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ для вас Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ gcc? Если Π²Ρ‹ ΠΈΡ‰Π΅Ρ‚Π΅ способы ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅ΠΌΠΎΠ³ΠΎ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°, ΠΏΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠΈ сСссии ΠΎΡ‚Π»Π°Π΄ΠΊΠΈ ΠΈΠ»ΠΈ просто Π½Π°Π±Π»ΡŽΠ΄Π°Ρ‚ΡŒ Π·Π° дСйствиями, ΠΏΡ€Π΅Π΄ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅ΠΌΡ‹ΠΌΠΈ gcc для прСвращСния вашСго исходного ΠΊΠΎΠ΄Π° Π² исполняСмый Ρ„Π°ΠΉΠ», Ρ‚ΠΎ знакомство с этими ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ. Π’Π°ΠΊ Ρ‡Ρ‚ΠΎ, Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅.

Напомню, Ρ‡Ρ‚ΠΎ gcc Π΄Π΅Π»Π°Π΅Ρ‚ нСсколько шагов, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½. Π’ΠΎΡ‚ нСбольшоС объяснСниС ΠΈΡ… смысла:

    ΠŸΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅: Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, Π±ΠΎΠ»Π΅Π΅ Π½Π΅ содСрТащСго Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ². Π’Π΅Ρ‰ΠΈ Π²Ρ€ΠΎΠ΄Π΅ Β«#ifΒ» Π½Π΅ ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ поняты компилятором, поэтому Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Ρ‹ Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π’Π°ΠΊΠΆΠ΅ Π½Π° этой стадии Ρ€Π°Π·Π²ΠΎΡ€Π°Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ макросы, дСлая ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄ большС, Ρ‡Π΅ΠΌ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹ΠΉ.

    ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ: БСрСтся ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄, проводятся лСксичСский ΠΈ синтаксичСский Π°Π½Π°Π»ΠΈΠ·Ρ‹, ΠΈ гСнСрируСтся ассСмблСрный ΠΊΠΎΠ΄. Π’ Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ этой Ρ„Π°Π·Ρ‹, gcc Π²Ρ‹Π΄Π°Π΅Ρ‚ сообщСния ΠΎΠ± ΠΎΡˆΠΈΠ±ΠΊΠ°Ρ… ΠΈΠ»ΠΈ прСдупрСТдСниях Π² случаС, Ссли Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΏΡ€ΠΈ парсингС вашСго ΠΊΠΎΠ΄Π° Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Ρ‚Π°ΠΌ ΠΊΠ°ΠΊΠΈΠ΅-Π»ΠΈΠ±ΠΎ ошибки. Если Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ΡΡ оптимизация, gcc ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠΈΡ‚ Π°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ваш ΠΊΠΎΠ΄ Π² поисках ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ ΠΈ ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ с Π½ΠΈΠΌΠΈ дальнСйшСм. Π­Ρ‚Π° Ρ€Π°Π±ΠΎΡ‚Π° происходит Π² ΠΌΠ½ΠΎΠ³ΠΎΠΏΡ€ΠΎΡ…ΠΎΠ΄Π½ΠΎΠΌ стилС, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈΠ½ΠΎΠ³Π΄Π° трСбуСтся большС ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΡ€ΠΎΡ…ΠΎΠ΄Π° ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ для ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ.

    АссСмблированиС: ΠŸΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ΡΡ ассСмблСрныС ΠΌΠ½Π΅ΠΌΠΎΠ½ΠΈΠΊΠΈ ΠΈ производятся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ ΠΊΠΎΠ΄Ρ‹, содСрТащиС ΠΊΠΎΠ΄Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄. Часто Π½Π΅Π΄ΠΎΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½Π° стадии компиляции Π½Π΅ производятся ΠΊΠΎΠ΄Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄, это дСлаСтся Π½Π° стадии ассСмблирования. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‚ΡΡ ΠΎΠ΄ΠΈΠ½ ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°, содСрТащиС ΠΊΠΎΠ΄Ρ‹ ΠΊΠΎΠΌΠ°Π½Π΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΌΠ°ΡˆΠΈΠ½ΠΎΠ·Π°Π²ΠΈΡΠΈΠΌΡ‹ΠΌΠΈ.

    Компоновка: ВрансформируСт ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹Π΅ исполняСмыС. ΠžΠ΄Π½ΠΈΡ… Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ΄ΠΎΠ² ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ нСдостаточно для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ опСрационная систСма распознала ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΠ»Π° ΠΈΡ…. Они Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ встроСны Π² Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ»Π½ΡƒΡŽ Ρ„ΠΎΡ€ΠΌΡƒ. Π­Ρ‚Π° Ρ„ΠΎΡ€ΠΌΠ°, извСстная ΠΊΠ°ΠΊ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, ΠΊΠ°ΠΊ ОБ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ», ΠΊΠΎΠΌΠΏΠΎΠ½ΡƒΠ΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΈ Π΄Π΅Π»Π°Π΅Ρ‚ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ Ρ€Π°Π±ΠΎΡ‚Ρƒ. ELF являСтся Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для Linux Π½Π° x86.

    ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ gcc описаны здСсь, прямо ΠΈ косвСнно затрагивая всС Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ стадии, поэтому для ясности, эта ΡΡ‚Π°Ρ‚ΡŒΡ построСна ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

    ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, относящиСся ΠΊ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ

    ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, относящиСся ΠΊ Π²Ρ‹Π·ΠΎΠ²Ρƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

    ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, относящиСся ΠΊ ΠΎΡ‚Π»Π°Π΄ΠΊΠ΅

    ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹, относящиСся ΠΊ ΠΏΡ€Π΅ΠΏΡ€ΠΎΡ†Π΅ΡΡΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ

    ΠŸΡ€Π΅ΠΆΠ΄Π΅ всСго, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ознакомимся с Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ инструмСнтами, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠΌΠΎΠ³ΡƒΡ‚ Π½Π°ΠΌ ΠΏΡ€ΠΎΠ½ΠΈΠΊΠ°Ρ‚ΡŒ Π² ΠΈΡ‚ΠΎΠ³ΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ΄:

    ΠšΠΎΠ»Π»Π΅ΠΊΡ†ΠΈΡ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ ELF, которая Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Ρ‚Π°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, ΠΊΠ°ΠΊ objdump ΠΈ readelf. Они парсят для нас ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ELF.

    Π‘Ρ‚Π΅ΠΏΠ΅Π½ΡŒ ошибки = ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½Ρ‹Π΅ Π²Π΅Ρ‚Π²ΠΈ / ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π²Π΅Ρ‚Π²ΠΈ

    Π’Π΅ΠΏΠ΅Ρ€ΡŒ вычислим ΡΡ‚Π΅ΠΏΠ΅Π½ΡŒ ошибки для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π±ΠΈΠ½Π°Ρ€Π½ΠΎΠ³ΠΎ Ρ„Π°ΠΉΠ»Π°. Для non-optimized ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ 0,5117%, Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ optimizedO2 ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ» 0,4323% - Π² нашСм случаС, Π²Ρ‹Π³ΠΎΠ΄Π° ΠΎΡ‡Π΅Π½ΡŒ ΠΌΠ°Π»Π°. ЀактичСская Π²Ρ‹Π³ΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π°Ρ‚ΡŒΡΡ для Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… случаСв, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ gcc сам ΠΏΠΎ сСбС Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±Π΅Π· Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΡƒΠΊΠ°Π·Π°Π½ΠΈΠΉ. ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, ΠΏΡ€ΠΎΡ‡Ρ‚ΠΈΡ‚Π΅ ΠΎ __builtin_expect() Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎ gcc для ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.