Grafik kitaplıklarının neden bir bağlayıcıya ihtiyacı var? Bağlayıcının çalışmasında acemi için yardımcı. Depolama öğelerinin adı: C dosyasının ortasında ne var

Tipik bir sistemde, anonim bir program anında galip gelir. Dış görünüm programının işi, "standart" C kitaplığının deposuna girebilecek çeşitli işlevleri depolamaktır (örneğin,yazdır() , malloc() , yazı yazmak() ve benzeri.).

Standart kitaplığa karşı bir dış görünüm programı gibi, bir dış görünüm programının kural olarak kendi kitaplık kopyasının intikamını alması anlamına gelir. Yazık, irrasyonel kaynak seçimine getirmek. Oskіlki kütüphanesi є є spilnoy ile, rozumnі o çalışabilirdi, schob cilt programıdiye sordu kütüphanenin global bir kopyasında değil,mistila їkopyalayın. Böyle bir şey vag içinde olduğu gibi, іv'yatі іv'yatі sаnоmіya sаlоsistemnyh resursіv değildir.

Statik düzen Terim "statik olarak bağlantılı" program ve kitaplığın, linkleme işlemine bir saat boyunca linker yardımı için birleştirildiği anlamına gelir. Bu sırayla, program ve kütüphane arasındaki bağlantı, bağlantı işleminin yapıldığı saatin altında sabitlenir ve kurulur, böylece program daha önce çalışacaktır. Krіm іnshoy, bu aynı zamanda değiştirebileceğiniz anlamına gelir tsey zv'azok aksi takdirde, programın yeni bir kitaplık sürümüyle ek olarak yeniden birleştirilmesiyle ilgili olarak.

Sessiz durumlarda, programın çalışması sırasında kitaplığın doğru sürümünün mevcut olacağına dair bir kanıt yoksa veya sessiz durumlarda, kitaplığın yeni bir sürümü test ediliyorsa ve sessiz durumlarda statik bir düzen mümkündür. yine de farklı bir bileşen yüklemeye gerek yoktur.

Statik bağlantılı programlar, nesne arşivleriyle (kütüphaneler ), böylece a'yı genişletebilirsiniz. Böyle bir nesne kümesinin bir örneği, standart kitaplık libc.a'dır.

Dinamik düzen Terim "dinamik olarak bağlantılı" programın bir günlük kitaplık olduğu anlamına gelirolumsuzluk Bağlama işlemi için bir saat boyunca bir bağlayıcı yardımı için birleştiler. Natomist, linker bilgiyi linker dosyasına koyar, bu da kendi yöntemiyle, bölünen bazı nesne modüllerinde kodun ve bazı dinamik linkerlerin (çalışma zamanı linker) suçlu olduğunu bilmenizi sağlar. Tse, program ile bölünmekte olan nesne arasındaki bağlantının program saatinde kurulmakta olduğu ve kendisi, başlangıçtaki koçanın üzerinde, bölünen gerekli nesnelerin aranması ve düzenlenmesinin gerçekleştirildiği anlamına gelir. dışarı.

Bu tür program denirkısmen bağlı yürütülebilir dosya (kısmen bağlı yürütülebilir dosya) , sahip oldukları parçalara tam anlaşmada izin verilir, yani bağlantı sürecindeki bağlayıcı, programda referans verilen tüm sembolleri kitaplıktan doğru kodla göstermedi. Zamіst tsgogo, komonuvalnik vkazuє,yakomu sama bölünen nesneler, programın çağırdığı fonksiyonları bilir. Sonuç olarak, kendini bağlama süreci, her yıl programlama anında gerçekleşir.

Dinamik olarak bağlantılı programlar, uzantılarla, ayrılmış nesnelerle bağlantılıdır. Böyle bir nesnenin bir örneği, standart C kitaplığı libc.so'dur.

Bunlar hakkında bir takım araçlardan bahsetmek için, hangi tip düzenin ayarlanabileceğini - statik veya dinamik - muzaffer seçenek Komut satırı QCC yardımcı programları. Bu seçenek daha sonra uzantıyı değiştirecektir (bir ya da öylesine).

Robotik programlar sürecinde kod ekleme Böyle bir yaklaşımla, programlar tarafından çağrılan fonksiyonlar sadece çağrı aşamasında atanacaktır. Tse nada dodatkovі mozhlivosti.

Robot sürücü diskinin poposuna bir göz atalım. Sürücü başlar, cihazı test eder ve gösterir sabit disk. Ardından sürücü, disk bloklarını işleme atamaları olan io-blk modülünü dinamik olarak yakalar, çünkü eklerin engellenmesi ortaya çıktı. Sürücü blok düzeyinde diske erişimi reddettiği için diskte iki bölüm gösterir: DOS bölümü ve QNX4 bölümü. Sürücünün rozmіr'ını değiştirmeyin sabit disk, yeni başlayana kadar sürücüler açılmıyor dosya sistemleri. Sistemin çalıştığı bir saatin altında, sürücü iki bölmeyi (DOS ve QNX4) ve ancak bundan sonra fs-dos.so ve fs-qnx4.so dosya sistemleri modüllerini zavantazhit vіdpovіdnі algılayabilir.

Bu sayede sahnenin daha fazla fonksiyonuna gerekli fonksiyonlar eklenerek, sabit disk sürücüsünün esnekliği ve kompaktlığı artırılmıştır.

Ayrılan nesneler nasıl galip gelir? Programın nasıl bölündüğünü anlamak için, önce değiştirilmiş modülün formatına, ardından programın başlangıcında geçtiği sessiz aşamaların sırasına bakmak gerekir. ELF formatı OS QNX Neutrino'da, şu anda SVR4 Unix sistemlerinde kabul edilen bağlantılı ve bağlantılı modüllerin ikili formatı (Yürütülebilir ve Bağlanabilir Format, ELF) benimsenmiştir. ELF formatı yalnızca dağıtılan kitaplıkların oluşturulmasını basitleştirmekle kalmaz, aynı zamanda bir saatlik robotik programlar için dinamik olarak etkileşime giren modüllerin olanaklarını da genişletir.

Şek. 7.1 Okumalar İki görünüm için ELF dosyası: düzen temsili ve görselleştirme temsili. Programları veya kütüphaneleri bağlama sürecinde galip geldiği için, bağlamanın sunulması buna değer.bölümler nesne dosyasının ortasında. Bu dosyadaki bilgilerin çoğunu kapsayan bölümler: veriler, talimatlar, özelleştirme bilgileri, tanımlayıcılar, vergi bilgileri vb.segmentler .

Programı veya kütüphaneyi bağlama sürecinde, aynı özelliklere sahip olabilecek, segmentlere dönüşen kızgın bölümlerin yardımı olacaktır. Kural olarak, görüntüleme için tanınan veya "yalnızca okumak için" tanınan verilerin intikamını alan tüm bölümler tek bir segmentte düzenlenir.Metin, ve verilerBSS bir segmente monte edilecekveri. Qi segmentleri denirzavantazhuvalnymi segmentleri (yük segmentleri) koku, oluşturma işlemi sırasında hafızaya yakalanmaktan sorumludur. Örneğin tanımlayıcılara ilişkin bilgiler ve vergi bilgileri gibi diğer bölümler t.z.zavantazhuyutsya olmayan segmentler (yüksüz segmentler) .

tsієї statti.

Montajcıda sembolik isim tablolarının organizasyonu.

Bu tablo, ilk geçiş saatinde montajcı tarafından seçilen semboller ve anlamları hakkında bilgi içerir. Sembolik isimler tablosundan önce, montajcı başka bir pasaja gider. Sembolik isimlerin tablolarını düzenleme yöntemlerine bir göz atalım. Bir dizi çifti toplayan bir çağrışımsal bellek olarak bir tablo veriyoruz: ismin sembolü anlamdır. Çağrışımsal bellek im'yanın anlamını görebilir. Adın ve değerin değiştirilmesi, ad ve değere ayarlanabilir.

Montajdan sonra.

Sembolik isim tablosu, bir isim-değer çiftleri dizisine ilk geçişin sonucu olarak sunulur. Gerekli bir sembolün aranması, tablonun son incelemesi ile belirlenir, belgeler geçerli olarak tanınmayacaktır. Bunu yapmanın böyle bir yolunu programlamak kolaydır, ancak pratiktir.

İsimlere göre sıralama.

İsimler önce alfabeden sonra sıralanır. Galiplerin isimlerini aramak için, tablonun orta öğesinin adlarını eşleştirmek için gerekli olan çift eşleştirme algoritması kullanılır. Gerekli açılım sembolü orta elemandan alfabetik olarak daha yakınsa, tablonun ilk yarısında ve uzaktaysa, tablonun diğer yarısındadır. İhtiyaç duyulduğu anda ortadaki elemanın ismi ile çalışır, ardından arama tamamlanır.

Çift görme algoritması daha pratiktir, tablonun son revizyonu daha düşüktür, tablonun prote elemanlarının alfabetik sıraya göre sıralanması gerekir.

Önbellek kodlaması.

Bu yöntemle, çıktı tablosu bazında, isimleri K-1 boşluğunda tam sayı olarak görüntüleyen bir önbellek işlevi oluşturulacaktır (Şekil 5.2.1, a). Önbellek işlevi, örneğin, ASCII koduyla temsil edilen adın tüm satırlarını çarpma işlevi veya eşit bir değer vermek gibi başka bir işlev olabilir. Bundan sonra, satırları (yuvaları) temizlemek için önbellek tablosu oluşturulur. Dış görünüm satırında, aynı önbellek işlevi değerine (Şekil 5.2.1 b) veya yuva numarasına sahip olabilen adlar (örneğin alfabetik sırayla) sıralanır. Önbellek tablosunda n karakter adı varsa, dış görünüm yuvasındaki ortalama ad sayısı n/k olur. n = k olduğunda, gerekli sembolik adın değeri yalnızca bir arama gereklidir. Yolu değiştirerek, tabloların boyutunu (yuva sayısını) ve isteğin hızını değiştirebilirsiniz. Zv'yazuvannya bu zavantazhennya. Program bir dizi prosedür (alt program) olarak kullanılabilir. Bir hevesle montajcı yayın birbiri ardına prosedür, oluşturma nesne modülleri hafızada onların hatırası. otrimannya vykonuvannogo için buti nedeniyle dvіykovoy kodu biliyorum po'yazanі tüm yayın prosedürleri.

İletişim ve zavantazhennia işlevleri, adlandırıldığı gibi özel programlara dayanmaktadır. zavantazhuvachs diyen linkerler, link editörleri veya bağlayıcılar.


Bu şekilde, hafta sonu bitmeden tam olarak hazır olması için programın iki adıma ihtiyacı vardır (Şekil 5.2.2):

● nesne modülünü kaldırma yöntemiyle cilt rutininin derleyicisi veya derleyicisi tarafından uygulanan çeviri. Yayın saati değişecek dışarıdan film tatil dil, farklı komutlar ve kayıtlar neler olabilir;

● İkili kodu çıkarmak için bağlayıcı tarafından birleştirilen nesne modüllerinin bağlanması. Wiccan prosedürlerinin Okrema çevirisi olası af veya prosedürleri değiştirme ihtiyacı. Bu durumlarda, tüm nesne modüllerini yeniden bağlamak gerekir. Oskіlki zv'yazuvannya vіdbuvaєtsya daha zengin, daha düşük çeviri, vykonannya tsikh iki krokіv (yayın ve zv'yazuvannya) ek programlarla bir saat kazandırır. Bu özellikle yüz binlerce modülü kapsayan programlar için önemlidir. MS-DOS, Windows ve NT işletim sistemlerinde, nesne modülleri ".obj" uzantısına ve kullanılan ikiz programlarda ".exe" uzantılarına sahip olabilir. Bir UNIX sisteminde, nesne modülleri bir ".o" uzantısına sahip olabilir, ancak oluşturulabilen ikili programlar olamaz.

Bağlayıcı işlevleri.

İlk derleme geçişinin başlangıcından önce, komutun adresinin konumlandırıcısı 0'a ayarlanır. Bu kısa, adres 0 ile ortaya değişiklik saatinin nesne modülü olan ödeneğe eşdeğerdir.

Meta düzeni - Bağlayıcının ortasında bulunan programın sanal adres alanının daha doğru bir temsilini oluşturun ve ilgili adresler için tüm nesne modüllerini yerleştirin.


Adres 0 ile ortada olup olmadıklarına ve aynı modüldeki BRANCH komutundan MOVE komutuna başlayıp başlamadıklarına bakılmaksızın bazı nesne modüllerinin yerleşiminin özelliklerine bir göz atalım (Şekil 5.2.3 a). Programı başlatmadan önce, bağlayıcı, dönüştürülmekte olan çift kodu oluşturan nesne modüllerini ana belleğe yerleştirir. Sıfır adresinden başlayan, vektörleme, yeniden yazma için kazanan küçük bir bellek bölümü seslendirin işletim sistemi ve diğer amaçlar.

Bunun için, Şekil 2'de gösterildiği gibi. 5.2.3, b programları sıfır adresinden değil, 100 adresinden başlar. Fig. 5.2.3 ve çok fazla adres alanı ödünç almak, belleği yeniden yazma sorununu suçlar. Yanlış adresleme ile bıyık komutları hafızaya gönderilmez. Örneğin, nesne modülü A'nın 300 adresi ile ortada bulunan nesne modülü B'nin (Şekil 5.2.3 b) çağrı-tıklama komutu (Şekil 5.2.3, a), iki kişi için geçerli değildir. sebepler:

● CALL B komutu başka bir adresle ortada (200 değil 300); ● Oskіlki cilt prosedürü okrem'e çevrilir, montajcı adresi CALL В komutuna nasıl ekleyeceğini belirleyemez. Böyle bir sorun denir duygusuz mesaj sorunu. Suçlar ve nedenler, nesne modüllerinin daha fazla adres alanını tek bir doğrusal adres alanında birleştiren bir bağlayıcının yardımı için kullanılır, bunun için:

● nesne modüllerinin ve dozhinlerinin gelecekteki tablosu;

● verilen tablo temelinde, dış görünüm nesne modülüne adresleri atayın;

hafızaya ve modülün doğru adresi olarak bunların dış yüzeyine bir yer değiştirme sabiti ekleyin (bu yönde 100);

● kullanılan komutları bilmek prosedürlerden önce bu prosedürlerin adresini onlara ekler.
Aşağıda, ilki istenen nesne modüllerinin bir tablosu (Tablo 5.2.6) bulunmaktadır. Onlara cilt modülünün adlarını, dozhinalarını ve posta adreslerini verirler. Tablo 5.2.6 ve şek. 5.2.3, sanat. bir nesne modülünün yapısı. Nesne modülleri aşağıdaki bölümlerden oluşur:

Modül Adı, deyak Ek Bilgiler(örneğin, modülün son kısımları, montaj tarihi);

sembol modülü için atamaların listesi(sembolik adlar) aynı anda їх değerleriyle. Bu sembollere başka modüller de eklenebilir. Birleştirici programlayıcım, PUBLIC yönergesinin yardımıyla, giriş noktaları tarafından hangi sembol adlarına uyulacağını belirler;

muzaffer olan sembollerin bir listesi, diğer modüllere atandığı gibi. Listede ayrıca diğer makine komutları tarafından seçilen sembolik adlar bulunur. Bu, oluşturucunun uygun adları hecelemek için doğru komut adreslerini eklemesine izin verir. Bu nedenle, bir prosedür, çağrılan prosedürlerin adlarını (EXTERN yönergesi yardımıyla) seslendirerek bağımsız olarak çevrilmiş diğer prosedürleri çağırabilir. Belirli giriş noktası türleri için aynı mesajlar tek bir tabloda birleştirilir;

makine komutları ve sabitleri;

kelime hareketi. Komutlardan önce, yakі m_stat bellek adresleri, hareketli bir sabit (div. small. 5.2.3) ekleyebilirsiniz. Bağlayıcının kendisi, makine komutlarının intikamını almak için kullanılan kelimeler ve benzeri - sabitler gibi tanımlanamaz. Bu nedenle, bu tabloda taşınması gereken adresler hakkında bilgi bulunmaktadır. Bir bit tablosu, potansiyel olarak adrese getirilecek cilt biti üzerinde veya taşınması gereken adresin açık bir listesi olabilir;

modülün sonu, koçanın üzerindeki adresler ve ayrıca kontrol toplamı af atanması, modülü okuma saatinde bir artış. Vіdmitimo, scho makine komutları ve sabitler Nesne modülünün bir kısmı, sanki vikonnannya için bellekte yakalanacakmış gibi. vikoristovuyutsya ve vіdkidayutsya komonuvalnik'in diğer bölümleri koçanı vykonannya programlarına. Daha fazla bileşen vicorist 2 koridor:

● tüm nesne modülleri sırayla okunur ve mevcut modüllerin adları ve adları tablosunun yanı sıra bu mevcut mesajların giriş noktalarına eklenen bir sembol tablosu olacaktır;

● Ardından modüller tekrar okunur, belleğe taşınır ve bağlanır. Hareketli programlar hakkında. Programların hafızasındaki gibi dolaşma sorunu, adres tablolarındaki gibi hareket etmelerinin merhametli hale gelmesiyle açıklanmaktadır. Programları taşıma kararını övmek için son çağrı anını bilmek gerekir. sembolik isimler mutlak ile adresler fiziksel hafıza.

Bir saatlik övgü çözümü Ana bellekte adresi belirleme anı çağrılır, bu da sembolik adı doğrular. Іsnuyut raznі saat için değişken priynyattya kararı schodo zv'yazuvannya: eğer yazıldığından program, eğer program Yayınlanmak, bir araya getirilmek, dolaştırılmak ya da eğer emretmek, adresi intikam almak için, kazanç.İleriye bakma yöntemi, mutlak fiziksel adresleri olan sembolik adları gösterir. Bu nedenle, aramadan sonra programları taşımak mümkün değildir.

Bağlanırken iki aşama görülebilir:

ilk sahne, yakomu sembolik isimler ara beni sanal adresler. Eğer nesne modüllerinin linker poov'yazuє okrem_ adres uzayı tek bir lineer adres uzayına dönüştürülürse, sanal bir adres uzayı oluşturacağım;

diğer aşama, ne zaman sanal adresler ara beni fiziksel adresler Ancak başka bir işlemden sonra iletişim süreci tamamlanacaktır. Gerekli zihin değiştiren programlarє sanal adresi ana fiziksel belleğin adresiyle değiştirmenize izin veren bir mekanizmanın varlığı (başka bir adımı ziyaret edin). Bu tür mekanizmalara yalan:

● yanlarda çekişme. Adres alanı, şek. 5.2.3, önceden atanmış olan ve A, B, C ve D sembolik adlarıyla eşleşen sanal adresleri değiştirmek için. Tüm fiziksel adresler yan tablodan silinmelidir. Bu nedenle, programı ana bellekte taşımak için programın kendisini değil, yalnızca yanlar tablosunu değiştirmek yeterlidir;

● Victoria yer değiştirme kaydı. Bu kayıt fiziksel adreste belirtilir. koçanın üzerinde programı taşımadan önce işletim sistemi tarafından yakalanan akış programları. Ek donanım desteği için, yer değiştirme registerı hafızanın tüm adreslerine verilir, öncelikle koku hafızaya alınır. Coristuvach'ın cilt programı için hareket etme süreci “görünür”. Mekanizmanın özelliği: yanlardaki bölünme görünümünde, tüm program yukarıdan hareket ettirilmelidir. Kod taşımak ve veri taşımak için kayıtlar (veya örneğin Intel işlemciler gibi bellek bölümleri) varsa, bu programın iki bileşen gibi hareket etmesi gerekir;

● mekanizma hayvan bir takım lichilnik'in anısına. Farklı bir mekanizma olması durumunda, program ana belleğe taşındığında sadece birkaç komut güncellenir. Programa, komutların adıyla bağlantılı olanın tüm bağlantılarına (veya mutlak, örneğin, giriş-vivoda'daki uzantıların kayıtlarına mutlak adreslerdeki bağlantılar) denir. pozisyondan bağımsız program. Böyle bir program, adresi değiştirmeden sanal adres alanının herhangi bir yerine dağıtılabilir. Dinamik çağrı.

Aramanın daha iyi bir yolu olabilir özellik: zv'yazok z usima işlemleri, programlara ihtiyaç duymak, koçan robotik programlarına yükleyin. Prosedürlerin, başlıkların derlenmesini birbirine bağlamanın daha rasyonel yolu dinamik zv'azuvannyam polyagaє vstanovlennі zv'yazku'nun cilt prosedürü ilk hafta sonu saatinde. Öncelikle MULTICS sisteminde durgunluklar vardı.

Sistemde dinamik iletişimÇOKLUKLAR. Cilt için program tespitler çağrı segmenti, cilt prosedürü bilgi bloğunu kaldırın (Şekil 5.2.4).

Bilgi şunları içerir:

● prosedürün sanal adresi için ayrılmış "Dolaylı adres" kelimesi;

● görünen lanset karakterlerinden alındığı için prosedür adı (TOPRAK, YANGIN vb.). Dinamik bağlantı ile, mov girişindeki prosedür çağrıları, ek dolaylı adresleme için çıkış bloğunun “Dolaylı adres” kelimesine yönlendirilen komutlara çevrilir (Şekil 5.2.4). Derleyici aynı kelimeyi de hatırlayacaktır. yanlış adres, veya özel bit seti, sistem kesintisi ne tür bir çağrıdır (gibi macunlar). Sıradaki ne:

● bağlayıcının prosedür adlarını (örneğin, EARTH) bilmesi ve bu tür adlarla derlenmiş bir prosedür için yerel dizini aramaya devam etmesi;

● bilinen prosedüre, şekil 1'de gösterildiği gibi geçersiz adres üzerine yazıldığı için "EARTH Address" ("güç segmentindeki" ses) sanal adresi atanır. 5.2.4;

● komut, sanki bir af çağrısı yapıyormuş gibi, yeniden galip geldi. Tse, programın bir ay boyunca robotun çalışmasına devam etmesine izin verir, sistem yeniden başlatılıncaya kadar durmayacaktır. EARTH prosedüründen önce gelen tüm aramalar affedilmeden iptal edilecektir, ancak "Dolaylı adresler" kelimesinin değiştirildiği segmentte artık "EARTH adresleri" sanal adresi gösterilir. Bu sıralamada, önce ikili prosedürü çağrılırsa, görevlerin birleştiricisi aynı değildir. Bağlayıcının bir sonraki çağrısına gerek yoktur.

Windows sisteminde dinamik arama.

Dinamik olarak bağlanan kitaplıklar (Dinamik Bağlantı Kitaplığı - DLL), prosedürler ve (veya) verilerin yanı sıra bağlantı için kullanılır. Kitaplıklar ".dll", ".drv" (sürücü kitaplıkları - sürücü kitaplıkları için) ve ".fon" (yazı tipi kitaplıkları - yazı tipi kitaplıkları için) uzantılı dosyalar olarak tasarlanmıştır. Prosedürlerinin ve verilerinin farklı programlar (süreçler) arasında dağıtılmasına izin verirler. DLL'nin en kapsamlı biçimi, programlara bir gecede erişilebilen bellekte zavantazhuyutsya olan bir dizi prosedürden oluşan bir kitaplıktır. Şekildeki bir örnek gibi. Şekil 5.2.5, bir DLL dosyasını A, B, C ve D prosedürlerinin yerini alacak şekilde değiştirmek için çeşitli süreçleri göstermektedir. Program 1 ve 2, prosedür A'yı kullanır; program 3 - prosedür D, program 4 - prosedür B.
DLL dosyası, bir dizi girdi dosyasından bir bağlayıcı olacaktır. Yönlendirme ilkesi, muzaffer ikili kodun istemde bulunmasına benzer. Bir DLL dosyası oluşturulduğunda, bağlayıcıyı DLL'nin oluşturulması hakkında bilgilendirmek için bağlayıcıya özel bir bayrak iletildiğine dikkat edin. DLL dosyaları, birçok işlemci tarafından ihtiyaç duyulabilecek bir dizi kitaplık rutini kullanılarak oluşturulur. DLL dosyalarının tipik uygulamaları, sistem kitaplığından elde edilen prosedürlerdir. pencereler tıklaması ve harika grafik kütüphaneleri. DDL wiki dosyaları şunları sağlar:

● Diskteki bellek alanını koruyun. Örneğin, kitaplık bir cilt programıyla ilişkilendirilmiş gibi, galip gelirse, bu kitaplık bellekte ve diskte zengin ikiz programlarda görünecektir. DLL dosyaları kopyalanacaksa, dış görünüm kitaplığı bir kez diskte ve bir kez bellekte görünür;

●kütüphane prosedürlerinin güncellenmesini affedin ve dahası, zdіysniti novlennya, bundan sonra navit, vikoristovuyut olan programlar derlenmiş ve pov'yazanі olarak;

● yeni DLL dosyalarının dağıtımı yoluyla tespit edilen afları düzeltmek için (örneğin, İnternet üzerinden). Bununla, ana ikili programlarda günlük değişiklikleri çalıştırmak gerekli değildir. Temel yetki Bir DLL dosyası ile birleştirilmiş bir ikili program arasındaki ilişki, DLL dosyasının aşağıdaki özelliklere sahip olmasına bağlıdır:

● kendi başına başlayamaz ve çalışamaz;

● başlıktaki diğer bilgileri kaldırın;

● Kütüphanedeki yordamlarla ilgili olmayan birkaç ek yordam içerebilir, örneğin, DLL dosyasının gerektirdiği belleği görme ve diğer kaynakları yönetme yordamları. Program bir DLL dosyasından iki şekilde bağlantı kurabilir: örtük bağlantı yardımıyla ve açık bağlantı yardımıyla. saat örtük bağlantı koristuvach programı, adı verilen özel bir dosyaya statik olarak bağlıdır. kütüphaneyi içe aktar.

Bu kitaplık bir hizmet programı tarafından oluşturulur, aksi takdirde Yararçatal yoluyla şarkı bilgisi bir DLL dosyasından. Bağlama öğesi aracılığıyla içe aktarma kitaplığı, programın DLL dosyasına erişimi kaldırmasına izin verir, bu durumda dosya içe aktarma kitaplığına bağlanabilir. Windows sistemi vikonannya için zavantazhuetsya olan kontrol programına örtülü bir bağlantı ile. Sistem, DLL dosyalarının programdan kaldırıldığını ve gerekli tüm dosyaların zaten bellekten aktarılmakta olduğunu gösteriyor. Her gün dosyalar bir bilmece üzerinde ihmalkarca zavantazhuyutsya vardır.

Daha sonra, denilen prosedürlerin revizyonunun kapsamını belirleyebilmek için bu import kütüphanelerinin yapılarında değişiklikler yapacağız. Bu değişiklikler, program DLL dosyalarındaki prosedürü çağırabiliyorsa veya statik olarak onunla ilişkiliyse ve çalıştırabiliyorsa, programın sanal adres alanında görüntülenir.

saat açık bağlantı Koristuvach programıyla içe aktarmak için kitaplıklara ihtiyacınız yoktur ve DLL dosyalarını bir gecede içe aktarmanız gerekmez. Natomist Koristuvalnitskaya programı:

● zdіysnyuє vysnyuє vyklik doğrudan çalışma saatinde, DLL dosyasından schob kurulum bağlantıları;

● İhtiyacımız olan prosedürlerin adreslerini seçmek için ek bağlantılar kullanacağız;

● Sonraki program, DLL dosyasından bağlantıyı açmak için son bir çağrı oluşturduktan sonra;

● Kalan işlem bir DLL dosyasından bir bağlantı açıyorsa, bu dosya bellekten silinebilir. Bir sonraki adım, dinamik bağlantı prosedürünün DLL dosyaları Pratsyuє pototsі zukhvaloї programında ve svoіh zmіnnyh vikoristov yığın zukhvalої programları için. Dinamik sv'yazuvannі (statik) ve sposіb vstanovlenya zv'yazku'da Іstotnoy vіdmіnіstyu roboti prosedürleri.

David Drysdale, Bağlayıcılar için Başlangıç ​​Kılavuzu

(http://www.lurklurk.org/linkers/linkers.html).

Meta Makaleler - C ve C++ programcılarının bir bağlayıcının ne yaptığının özünü anlamalarına yardımcı olun. Geri kalan yıllar boyunca, çok sayıda meslektaşımı anlattım ve bu materyali erişilebilir hale getirmek için kartona aktarmanın zamanının geldiğini gördüm (ve bir daha açıklama şansım olmadı). [Mart 2009'da güncelleme: Windows düzenine ilişkin özelliklerin yanı sıra daha ayrıntılı olarak tek tanımlı kural hakkında ek bilgiler eklendi.

Benden önce yardım için gönderilenlerin tipik bir poposu, bu düzenin böyle bir affı:

g++ -o test1 test1a.o test1b.o

test1a.o(.text+0x18): "main" işlevinde:

: `findmax(int, int)" için tanımsız başvuru

Collect2: ld 1 çıkış durumu döndürdü

Tepkiniz "C harfini zikrederek unutmak" ise, o zaman her şeyi bilen Siz, bu makalede uyarılan her şeyi biliyorsunuz.

  • Tanımlama: C dosyasında ne var?
  • C derleyicisini soymak için ne
  • Bağlayıcı nasıl soyulur: 1. bölüm
  • İşletim sistemi ne soyulur
  • Bağlayıcı ne soyulur: 2. kısım
  • C++ görüntü geliştirme
  • Dinamik olarak meşgul kitaplıklar
  • Dodatkovo

Tanımlama: C dosyasında ne var?

Tsey razdіl - farklı depolar C dosyası hakkında kısa bir tahmin. Aşağıdaki listedeki her şey sizin için bir sansasyon olabilirse, o zaman her şey için daha iyi, bu bölümü atlayabilir ve hemen saldırıya geçebilirsiniz.

Arkada, sersemlemiş olanlar ile atanmış olanlar arasındaki farkı anlamak gerekir.

Bir kod veya bir danny olabilen uygulama ile im'ya göstermek için tasarlanmıştır:

  • Değiştirilebilir derleyici tarafından belirlenen, adın değerini ayarlayarak hafıza alanını güne ayırmak mümkündür.
  • Belirlenmiş fonksiyon zmushu derleyicisi fonksiyon kodu üretir

Derleyici ne olursa olsun, hangi işlevlerin atandığı veya değiştirildiği (aynı adlarla) farklı bir program alanında, açıkçası farklı bir C dosyasında mevcuttur. (Randevunun da gürültülü olduğu saygısını geri vermek için - aslında, bazı "başka yerlerde" programlar tam olarak çalışır).

Değişiklik için iki türün belirlenmesidir:

  • küresel değişiklikler, yakі іsnuyut protyazhu shogo zhyttєvogo döngü programları ("statik yerleştirme") ve farklı işlevlerden elde edilen yakі;
  • yerel değişiklikler, yakі deykoї ї ї ї ї ї scho vykonuєtsya ("yerel yerleştirme") ve yakі, ієї ї ї işlevlerinin ortasında mevcuttur.

“Erişilebilir” terimini kullanırken, anlaşılması gereken bir sonraki şey “randevu anında değişiklikle ilişkili adı açabilirsiniz”.

Birkaç okremih vipadkіv var, yakі z ilk kez bariz bir şey vermiyor:

  • statik yerel değişiklikler gerçekten küresel, programın tüm ömrünün protyagına dayanan, sadece bir işlevin sınırları içinde görünür gibi kokmasını sağlamak.
  • statik küresel değişiklikler tієyu razniceyu ile de küreseldir, kokuların yalnızca bir dosyanın sınırlarında mevcut olması, kokuların atanması.

Warto, statik bir işlevi ifade ederek, aralarında bir ismin işlevine dönebileceğiniz az sayıda yerin kolayca kısaltılabileceğini belirtir.

Global ve yerel değişiklikler için ilk değişikliği ayırabiliriz, yani. chi bude prostir, zminnoї pom'yati için vіdvedeniya, zapovneno şarkı değerleri.

Ve şimdi bilgileri, yardım malloc veya yeni için dinamik olarak görüldüğü gibi belleğe kaydedebiliriz. Bu durumda, isim üzerinde bir hafızanın görünümüne dönme imkanı yoktur, bu nedenle isimsiz hafıza alanının adresinin intikamını almak için işaretler - adlandırılmış değişiklikleri kazanmak gerekir. Tsya hafıza alanı ücretsiz yardım için çağrılabilir veya silinebilir. Bence dinamik yerleşimlerde haklı olabiliriz.

Önerildi:

küresel

Yerel

Dinamik

Neіnіtsia-

Neіnіtsia-

goloshennia

int fn(int x);

harici int x;

harici int x;

Randevu

int fn(int x)

{ ... }

int x = 1;

(alan dії

Dosya)

intx;

(alan dії - dosya)

int x = 1;

(etki alanı dії - işlev)

intx;

(etki alanı dії - işlev)

int*p = malloc(sizeof(int));

daha fazla kolay yol Anlayın - sadece programın poposuna hayran kalın.

/* Başlatılmamış bir global değişikliğin tanımı */

int x_global_uninit;

/* Hedef global değişikliği başlattı */

int x_global_init = 1;

/* Başlatılmamış global değişikliğin ataması, en fazla

statik int y_global_uninit;

/* Başlatılan global değişikliğin ataması, en fazla

* sadece herhangi bir C dosyasının sınırlarında ada göre göz atabilirsiniz */

statik int y_global_init = 2;

/* Burada tanımlandığı gibi küresel değişimin yok edilmesi

* programın başka bir alanında */

harici int z_global;

/* Başka bir yere atanmış olarak kullanımdan kaldırılan işlev

* programlar (Ancak önüne "extern" ekleyebilirsiniz

* obov'yazkovo değil) */

int fn_a(int x, int y);

/* Belirlenmiş fonksiyon. Ancak, static olarak tanımlanmak, її

* Bu C dosyasının sadece sınırlarındaki isme tıklayın. */

statik int fn_b(int x)

x+1 döndür;

/* Belirlenmiş fonksiyon. */

/* function parametresine yerel değişiklikle uyulur. */

int fn_c(int x_yerel)

/* Başlatılmamış bir yerel değişikliğin tanımı */

int y_local_uninit;

/* Başlatılan yerel değişikliğin tanımı */

int y_local_init = 3;

/* Lokal ve global değişikliklere dönüşen kod,

* yanı sıra im'ya'daki işlevler */

X_global_uninit = fn_a(x_local, x_global_init);

Y_local_uninit = fn_a(x_local, y_local_init);

Y_local_uninit += fn_b(z_global);

dönüş (x_global_uninit + y_local_uninit);

C derleyicisini soymak için ne

p align="justify"> C Derleyicisinin robotunun, metni (son derece) mantıklı insanlara, bir bilgisayarın anlayabileceği şekilde dönüştürmesi beklenir. Çıkışta derleyici nesne dosyasını görür. UNIX platformlarında, ci dosyaları suffix.o olarak adlandırılabilir; Windows için - sonek.obj. Nesne dosyasının değiştirilmesi - esasen iki kelime:

bir C dosyasında belirli bir işlevi gösteren kod

C dosyasındaki genel değişikliklerin değerini belirten veriler (genel değişikliklerin başlatılması için, değişikliğin değeri nesne dosyasına kaydedilebilir).

Kod ve veriler, zaman zaman, onunla ilişkili matimut adları - değiştirilenlerin, randevularla ilgili oldukları işlevlerin adları.

Nesne kodu, programcı tarafından yazılan C talimatlarını izleyen makine talimatlarının sırasıdır (katlama sırasına göre): all if "and while" ve goto. Bu çağrışım, şarkı söyleyen ailenin bilgilerini manipüle etmek içindir ve bilgi, değiştirmemiz gereken - nebud olabilir. Kod ayrıca diğer kodlara da atıfta bulunabilir (programdaki diğer C fonksiyonlarının kodu).

Bi-decode, her iki işlevdeki değişikliği ifade etse de, derleyici, yalnızca değişikliğin veya işlevin değiştirilip değiştirilmediği önceden biliniyorsa buna izin verir. Goloshennya - burada programın başka bir alanında atanan tse obitsyanka.

Montajcının robotu, obitsyanki sayısını yeniden doğrulamaktır. Ancak, bir nesne dosyası oluşturursa, derleyici olağan kullanımla nasıl çalışır?

Aslında derleyici boş alanları doldurur. Boş bir yere (olasılık) isim verilebilir ama o isme verilen anlam henüz görülmemektedir.

Vahovuchi tse, programı gösteren bir nesne dosyasını şu şekilde daha fazla gezinerek görüntüleyebiliriz:

Bir nesne dosyasının analizi

Dosі mi, her şeye en eşit düzeyde baktı. Prote, pratikte nasıl çalıştığına hayret ediyor. Ana araç, UNIX platformundaki bir nesne dosyasının sembolleri hakkında bilgi sağlayan nm komutu olacaktır. İçin windows komutu/symbols seçeneğindeki dumpbin yaklaşık bir eşdeğerdir. Ayrıca nm.exe'yi içeren GNU binutils araçlarının Windows bağlantı noktaları da vardır.

Popodan alınan bir nesne dosyası için nm'nin nasıl göründüğünü görelim:

c_parts.o'dan gelen semboller:

Ad Değer Sınıf Tip Boyut Çizgi Kesit

fn_a | | U | NOTTİP | | |*UND*

z_global | | U | NOTTİP | | |*UND*

fn_b | 00000000 | t | FONK | 00000009 | |.metin

x_global_init | 00000000 | D | NESNE | 00000004 | |.veri

y_global_uninit | 00000000 | b | NESNE | 00000004 | |.bss

x_global_uninit | 00000004 | c | NESNE | 00000004 | |*COM*

y_global_init |00000004| gün | NESNE | 00000004 | |.veri

fn_c | 00000009 | T | FONK | 00000055 | |.metin

Sonuç farklı platformlarda biraz farklı görünebilir (ilgili bilgiyi almak için adama geri dönün), ancak anahtar kelimeler cilt sembolünün sınıfı ve yogo rosemirdir (ki є). Sınıfın farklı anlamları olabilir. :

  • U Sınıfı, görünmeyen mesajlar anlamına gelir, siz kendiniz “boş alan”, falcılık. Bu sınıf için iki nesne vardır: fn_a ve z_global. (nm'nin bazı sürümleri, bölümü istediğiniz şekilde *UND* veya UNDEF ile gösterebilir.)
  • Sınıf t ve T, anlamı olan kodu belirtir; chi n (T) dosyasındaki yerel işlev (t) olan t ve T arasındaki fark, yani. bula işlevi statik olarak seslendirilir. Pekala, biliyorum ki bazı sistemlerde örneğin bir bölüm gösterilebilir.
  • Küresel değişikliklerin intikamını almak için d ve D sınıfları. Hangi statik değişiklik d sınıfına aittir. Bölüm hakkında bilgi varsa, o zaman olacaktır.data.
  • Başlatılmamış genel değişiklikler için, statik olan b'yi, aksi takdirde B veya C'yi kabul edeceğiz. Bölüm her şey için daha iyi olacak. bss veya *COM*.

Harici C kodunun bir parçası gibi semboller de kullanabilirsiniz. Dikkatimizi buna çekmeyeceğiz, böylece derleyicinin iç mekanizmasının bir kısmı ses çıkarır, böylece programınız daha sonra derlenebilir.

Derleyici tarafından oluşturulan nesne dosyalarının yanı sıra programlama sistemine giren kitaplık dosyaları arasında bağlantı kurmak için atamaların bir bağlayıcısı (veya bir bağlantı düzenleyicisi).

Bir nesne dosyası (veya bir nesne dosyaları koleksiyonu) bir nokta ile kopyalanamaz, tüm modüllerin ve bölümlerin yuvaları birbiriyle ilişkilendirilmez. Bağlantı düzenleyicisini (bağlayıcı) öldürmek için. Yoganın sonucu tek bir dosya, başlıklar, zavantazhuvalnym modülüdür.

Yakalama modülü - bağlantıları düzenlerken nesne modülünden alınan yakalama ve değiştirme için eklenen bir yazılım modülü ve program makine komutlarının sırasına bakar.

Bağlayıcı, af hakkında bilgi için arayabilir, bu nedenle aynı şaraptaki nesne dosyalarını almaya çalıştığınızda, gerekli depoların olup olmadığını öğrenemezsiniz.

Bağlayıcının işlevi basittir. İlk nesne modülünden program bölümünü ve verilen mail adresini seçerek çalışmanıza başlıyorsunuz. Diğer nesne modüllerinin program bölümleri, rastgele bir adresin adreslerini doğrudanlık sırasına göre alır. Bununla program bölümlerinin mail adreslerini görüntüleme işlevini de görebilirsiniz. Aynı zamanda, program bölümlerinin metinleri veri bölümleri, tanımlayıcı tabloları ve çağrı adları ile birleştirilecektir. Kesit isteklerine izin verilir.

Program modülünün başlangıcı gibi yer değiştirme bölümleri için prosedürlerin, fonksiyonların ve değişikliklerin adres sabitlerinin değerinin hesaplanmasına kadar prosedürün oluşturulmasına izin verilir. Öyleyse, mesajlar zminnyh'e gönderilir, ob'єktnyh modülleri listesinde yakі vіdsutnі, editör zv'yazkіv organіzovuієє їkh poshukі librіbrіbrіbіv, svіdіvіvіv іyaa_program Eh, kütüphanenin depo hakkında bilgi sahibi olmasına gerek yok, af hakkında bilgi oluşturuyor.

Birlikte çalışan en basit yazılım modülünü oluşturmak için bağlayıcıyı arayın. Ancak, daha katlanır kürekler Bağlayıcı başka modüller oluşturabilir: bindirme yapısına sahip program modülleri, kitaplık nesne modülleri ve dinamik olarak bağlanan kitaplık modülleri.

Daha fazla nesne modülü modern sistemler Programlama sözde bilinen adrese dayalı olacaktır. Nesne dosyalarını oluşturan derleyici ve ardından bunları bir araya getiren bağlayıcı, programın indirme sırasında bilgisayarın gerçek belleğinin hangi alanında bulunacağını kesin olarak bilemez. Bu yüzden RAM'in ortasındaki gerçek adreslerle değil, gerçek harici adreslerle çalışır. Bu tür adresler, ortaya çıkan program ödünç alındığından, bellek alanının başı olarak alınan ilk akıllı noktaya atanır (noktayı programın ilk modülünün başına seslendirin).

Açıkçası, aynı program bu harici adreslerde hacklenemez. Bunun için, programın viconnanny üzerinde başlatıldığı sırada, bilinen adresi aracı olmadan gerçek (mutlak) adreslere dönüştüren bir modüle ihtiyaç vardır. Bu işleme bir çeviri adresi ve başlıkları belirtilen belirli bir modül adı verilir.

Ancak, vantazhuvach depo programlama sistemini başlatmaz, üzerine inşa edilen fonksiyonların parçaları zaten merkezi bir mimari şeklindedir. sayma sistemi, Bu durumda ortaya çıkan program, programlama sistemi tarafından oluşturulur. İlk aşamalarda işletim sisteminin gelişimi aynı modüllere bakmak üzerine kuruluydu, yayın adresini yazıyorlardı ve sonuna kadar programı hazırlıyorlardı - “görevin görüntüsü” başlığını oluşturdular. Böyle bir şema, zengin bir işletim sistemi için tipikti (örneğin, bir EOM tipi CM-1, OS RSX / 11 veya bir EOM tipi CM-4 üzerindeki RAFOS için de bir RTOS için). Görevin görüntüsü için kaydedilebilir nostaljik buruna aksi halde programın hazırlandığı en erken saatten sonuna kadar tekrar yoga yapın.

Mimarlığın gelişmesinden faydaların numaralandırılması Programın ritmine göre başlatıldığı sırada bilgisayar, yayın adresini aracı olmadan alabiliyordu. Kontrol edilecek dosyayı saklamak için gerekli olan, yayını göndermek için gerekli olduğu için adrese gönderilmesi gereken ayrı bir tablo ekleyin. Saldırıya uğramış dosyayı başlatma anında, işletim sistemi aşağıdaki tabloyu işledi ve bilinen adresleri mutlak adreslere dönüştürdü. Örneğin, böyle bir şema, MS-DOS gibi bir işletim sistemine eklenmiştir. Bu şemada, zavantazhuvach modülü çok günlük bir modüldür (aslında, işletim sistemi deposuna girer) ve programlama sistemi yalnızca çeviri tablosu adresini hazırlamaktan sorumludur - bu işlev bağlayıcıyı oluşturmaktır.

Modern işletim sistemlerinde, programın bir sonraki saati ile aynı anda kesintisiz olarak işlenebilmeleri için bir katlama yöntemi ve adres dönüşümü vardır. Olasılıklar üzerine temel Qi yöntemleri, mimaride donanım ipotekleri sayma kompleksleri. Adres çevirme yöntemleri, segment, yan ve segment tarafı bellek organizasyonuna dayalı olabilir. Todi vykonannya yayın adresi için programın başlatılması sırasında ilgili sistem tablolarını hazırlıyor olabilir. Bu işlevlerin işletim sistemi modüllerine düşme olasılığı daha yüksektir, bu nedenle pis koku programlama sistemlerindedir.

Okumadan önce makaleler:

Çin belleniminden Miui 9 Stable Global'a nasıl geçilir? zavantazhuvacha'nın engellemesini kaldırma



önişlemci derleyici bağlayıcı (7)

Şarap programı derleyicisinin bir bölümünün nasıl şaşırdığını ve bağlayıcının ne yapmaya çalıştığını anlamak istiyorum. Bu yüzden aşağıdaki kodu yazdım:

#Dahil etmek ad alanı std kullanarak; #Dahil etmek < class paramType >void FunctionTemplate(paramType val) (i = val)); void testi :: DefinedCorrectFunction (int val) ( i = val ; ) void Test :: DefinedIncorrectFunction (int val ) ( i = val ) void main () ( Test nesnesi (1 ); //testObject.NonDefinedFunction(2);//testObject.FunctionTemplate (2); }

Üç işlevim var:

  • DefinedCorrectFunction - ce normal fonksiyon, seslendirildi ve doğru bir şekilde tanımlandı.
  • DefinedIncorrectFunction - bu işlev doğru olarak bildirilir, ancak uygulama yanlıştır (günde;)
  • NonDefinedFunction - artık saçmalık yok. Randevu yok.
  • FunctionTemplate - işlev şablonu.

    Şimdi, bu kodu derlerken, günlük ";" için derleyicinin affını alıyorum. DefinedIncorrectFunction'da.
    Tamam, düzelteceğim ve daha sonra testObject.NonDefinedFunction (2) yorumunu yapacağım. Şimdi bağlayıcının affını alacağım. Şimdi testObject.FunctionTemplate(2)'yi yorumlayın. Şimdi günlük ";" için derleyicinin affını kaldıracağım.

İşlev şablonları için, pis kokunun derleyici tarafından okunmadığını anlıyorum, çünkü pis koku kodda yankılanmaz. Otzhe, vidsutni ";" derleyici için endişelenme, testObject.FunctionTemplate (2) üzerine tıklamadım.

testObject.NonDefinedFunction (2) için derleyici tereddüt etmedi, ancak bağlayıcı yaptı. Bildiğim kadarıyla, tüm derleyici, NonDefinedFunction işlevinin kınandığı için asaletten suçludur. Zdіysnennya hakkında dbav'da. Sonra bağlayıcı hırladı, çünkü uygulamayı bilmiyordum. Her şey yolunda gidiyor.

Bu yüzden nasıl derleyici oluşturulacağını ve nasıl bir bağlayıcı oluşturulacağını bilmiyorum. Bağlayıcının bileşenlerine ilişkin anlayışım kendi wikilerim ile yazılmıştır. Ayrıca, NonDefinedFunction adlandırılmışsa, NonDefinedFunction uygulamasının derlenip derlenmediğini kontrol edin ve yemin edin. Ancak derleyici, NonDefinedFunction'ın uygulanması hakkında bir şey eklemedi, ancak DefinedIncorrectFunction için çalıştı.

Çok istekliyim, o yüzden açıklayabilir ya da deaco'ya yardım edebilirsen.

Derleyici yeniden doğrular, chi filmin çıkış kodunu doğrular ve filmin anlamını yorumlar. Derleyici visnovok – tüm nesne kodu.

Linker poov'yazuє aynı anda farklı nesne modülleri, schob form exe. Bir sonraki aşamada belirlenmiş dağıtım fonksiyonları ve bir sonraki aşamada mevcut haftanın doğru kodu eklenir.

Derleyici, kodu tek bir çeviriymiş gibi derler. Çıktı dosyasını içeren tüm kodu derleyeceksiniz.
DefinedIncorrectFunction() çıktı dosyasına atanır, bu nedenle derleyici bunun geçerliliğini kontrol eder.
NonDefinedFunction() bir çıktı dosyasına atanabilir, bu durumda derleyicinin onu derlemesine gerek kalmaz, eğer başka bir çıktı dosyasına atanırsa, işlev çevirinin bir parçası olarak derlenir, ancak bir alt aşama yerine, işlev çevirinin bir parçası olarak derlenir. randevuyu arayan bağlayıcı tarafından bulunmayacak, daha sonra aramanın affını arayacaktır.

Derleyici işlevi şunlardan sorumludur: derlemek kodunuzu yazın ve onu nesne dosyalarına dönüştürün. Peki neden özledin; aksi takdirde kazananın adı değişmez, derleyici yemin eder, çünkü sözdizimsel aflar vardır.

Derleme sorunsuz bir şekilde tamamlanır tamamlanmaz nesne dosyaları oluşturulur. Nesne dosyaları katlanabilir bir yapıya sahip olabilir, ancak beş konuşmayı hatırlamak daha önemlidir

  1. Başlıklar - dosya hakkında bilgi
  2. Nesne kodu - makine kodu (çoğu durumda bu kod kendi kendine işlenemez)
  3. Taşınma hakkında bilgi. Kodun bazı bölümlerinin, gerçek yazım için adresleri değiştirmesi gerekecektir.
  4. Sembol tablosu- Kodun uygulandığı semboller. Koku atanabilir tsyumu diğer modüllerden içe aktarılan veya bağlayıcı tarafından belirlenen kodlar
  5. Vіdlagodzhuvalna іnformatsija - sahipler tarafından kazanın

Derleyici kodu derler ve sembol tablosunu şarapların yapıştığı bir dış görünüm sembolü ile doldurur. Semboller değişmeden ve işlev görmeden önce görülür. Güç kaynağı sembol tablosunu açıklar.

Bağlayıcı, çalışan bir ekten veya uyku kitaplığından alınabileceğinden, bu verilerin yazma kodunu yazmaya değer. Bir nesne dosyası, bağlayıcıyı anlayabilmeniz için adlardan oluşan bir nesne dosyasında farklı öğeleri ayarladığından, sembol tablosu adı verilen bir veri yapısı içerir.

Sonraki atama

Koddan bir işlev çağırırsanız, derleyici alt programın bitiş adresini nesne dosyasına koymaz. Son olarak, yer tutucunun değerini koda koyun ve oluşturucunun nesnelerin dosyalarından farklı sembol tablolarındaki gücü, nasıl işlendiğini bilmesine yardımcı olmak için bir not ekleyin ve geri kalanını buraya ekleyin. genişleme.

Oluşturulan nesne dosyaları, sembol tablolarındaki boşlukları dolduran, bir modülü başka bir i'ye bağlayan, onu bulan, yararlanılabilecek bir kod veren bir bağlayıcı tarafından işlenir.

Peki ya sizin özel vipadkanız -

  1. DefinedIncorrectFunction() - derleyici tanımlanmış işlevi kaldırır ve nesne kodu oluşturmak ve sembol tablosuna bir joker karakter eklemek için onu derlemeye başlar. Derleme affı, sözdizimsel bir af yoluyla, bu nedenle derleyici bir af ile kesintiye uğrar.
  2. NonDefinedFunction () - derleyici, atanamazsa bildirimi alır, ardından sembol tablosuna bir kayıt ekler ve uygun değerleri eklemek için bağlayıcıyı kullanır. Türünüz için başka bir dosya olup olmadığını belirtmezsiniz, bu nedenle bağlayıcı kesintiye uğrar. bağışlamak NonDefinedFunction'a tanımsız başvuru bu nedenle sembol tablosunda geçerli bir giriş için neyin gerekli olduğunu bilemezsiniz.

Anlaşılır olması için, yapılandırma kodunuzun şöyle olduğunu tekrar söyleyelim:

#Dahil etmek #Dahil etmek sınıf Test (özel: int i; genel: Test (int val) (i = val;) void DefinedCorrectFunction (int val); void DefinedIncorrectFunction (int val); void NonDefinedFunction (int val); şablon< class paramType >void FunctionTemplate(paramType val) (i = val;));

try.cpp dosyası

#include "try.h" test void Test :: DefinedCorrectFunction (int val) ( i = val ; ) void Test :: DefinedIncorrectFunction (int val ) ( i = val ; ) int main () ( Test testObject (1 ); testObject (2) işlevi atanmamış; //testObject.FunctionTemplate (2); 0 döndür; )

Sadece kodu kopyalayıp yapıştıralım, ama onu aramayın

$ g++ - c deneyin. cpp-o deneyin. o $

Bu mahsul günlük problemler olmadan akar. Yani, try.o nesne kodunuz var. Yogo'yu aramayı dene

$g++ deneyin. o dene. o : ` ana " işlevinde : deneyin . cpp :(. metin + 0x52 ): ` Test için tanımsız başvuru : Tanımsız

Test::NonDefinedFunction'ı tanımlamayı unuttunuz. Hadi anlamlı bir şekilde yoga yapalım okremumu dosya.

Dosya-try1.cpp

#include "try.h" void Test :: NonDefinedFunction (int val) (i = val;)

Yogayı Nesne Kodunda Derlemek

$ g++ - c deneyin1. cpp-o try1. o $

Biliyorum, başarılı. Fazladan bir dosya bağlamaya çalışmak

$ g++ deneyin1 . o/usr/lib/gcc/x86_64-redhat-linux/4.4. 5 /../../../../lib64/crt1 . o : ` _start " işlevinde: (. text + 0x20 ): ` main " Collect2'ye tanımsız başvuru : ld 1 çıkış durumu döndürdü

Hiçbir ana şey bu kadar oynanmaz!

Şimdi, gerekli tüm bileşenlerin bulunduğu iki okremі ob'ektnі kodunuz var. Sadece ikisini de bağlayıcıya gönderin

$g++ deneyin. o deneyin1. o $

Merhamet yok!! Bağlayıcının tüm fonksiyonların anlamını bilmesi (örneğin, nesne kodlarındaki boşlukları uygun değerlerle doldurması) gereklidir.

Çorba yemek istersen restorana git.

Çorba menüsüne bakın. Menüde yoga bilmiyorsanız, restorandan ayrılacaksınız. (derleyicinin gözünde, işlevi bilemeyenlerden korkmak için). Ne yaptığını nereden biliyorsun?

Çorbayı sipariş etmek için garsonu çağırıyorsunuz. Ancak menüde şarap olması mutfakta kötü koktuğu anlamına gelmez. Belki menü eskidi, belki de şefe çorbanın suçlu olduğunu söylemeyi unutmuştu. Bu yüzden tekrar gideceğim. (örneğin, sembolü bilemeyen bağlayıcı için bir af)

Kabul edilemez olan nokta sözdizimsel bir af, kod derlemekten suçlu değil. Şablonun uygulamasını da kullanabilirsiniz. Esasen, sözdizimsel analizin bir aşamasıdır ve bir kişi için nasıl “düzeltileceği ve güçlendirileceği” açık olmasına rağmen, derleyici bu çalışmadan suçlu değildir. Sadece “kruvaze bir kadın olduğunuzu, yolunuzdaki küçükler olduğunuzu ortaya koyamazsınız” ve devam edemezsiniz.

Derleyici orada wiki için işlevler arar, pis kokuya ihtiyaç vardır. Burada hiçbir şeye gerek yok, bunun için bir skarga yok. Bu dosya için af yok, taşları ortaya çıkarmak gerekiyor, gerekli, bu özel derleme bloğunda uygulanamaz. Bileşen, "bağlanmaları" için farklı derleme bloklarının seçimi için verilmiştir.

Derleyiciyi oluşturanlar ve bağlayıcıyı oluşturanlar onu uygulamaya koydu: yasal uygulama, dzherelo'nun belirteçlerini derleyicide kaydedebilir ve her şeyi bağlayıcıda çalıştırabilir. Mevcut uygulamalar bıyık için bağlayıcıya daha fazla girdi kısa optimizasyon. Şablonların bir çok erken uygulamasını yaptım, şu ana kadar şablonun koduna şaşırmadım, yeterlilik saatine kadar, şablonun sona ermesini tanımak için yeterli olacak. Bir koristuvach'ın görünümünden, kıkırdama olasılığınız daha yüksektir, chi є "gerekli teşhisleri" bağışlayın (bir derleyici veya bir bağlayıcı tarafından alınabileceğinden) chi є saptanamayan bir davranış.

DefinedIncorrectFunction sırasında analiz için gerekli olan metni bulabilirsiniz. Teşhis gerektirdiği için affın intikamını almak için Tsey metni. NonDefinedFunction durumunda: fonksiyon kazanılırsa komut atanmalıdır (aksi takdirde atama birden fazladır). yeni programє kararsız davranış gibi, bir özveri kuralını ihlal etmek. Teşhis gerekli değil (ancak muzaffer bir işlevin olmaması nedeniyle istenen sonucu vermediğim için uygulamayı gösteremiyorum).

Uygulamada, kolayca metni tek bir çeviri bloğuna çevirmenin bir yolu olarak görülebilen aflar, "görüntü tanılama" standardı tarafından belirlenir ve derleyici tarafından gösterilecektir. Pomelka, Yakі, Perevіrtsі Okarenio Odinitska geçidinde (tiroid, Vіdysten, Yaku Bethi aynı asansörlerde bulunur) dul olamaz є Resmi olarak görünmez davranış - keçe yetiştiriciliğinde, bir bileşenli bir butik ve bu tür vipadlerde yapabilirsiniz.

Sanki işlevler tanıtılmış gibi, çevirinin cilt birimindeki atamayı tekrarlamanıza ve dilin üzerindeki şablonları değiştirmenize izin verilecek şekilde değiştirilir, zengin af parçaları kopya oluşturuluncaya kadar görüntülenemez. . Günün sonunda, standart, şablonların uygulanması için büyük bir özgürlük sağlar: eğer derleyici şablonu yeterince analiz etmekten sorumluysa, onu belirlemek için de şablon biter. Ancak standart, örneğin oluşturulmasından önce daha fazla ayrıştırmaya izin vermek için typename gibi bir konuşma ekledi. Ancak, sonraki bağlamlarda, bu tür aflar, derleme zamanı olabilecek kopyanın oluşturulmasından önce veya erken uygulama saatinde tecelli edemez, dolayısıyla yaratımı saat anında yaratmış olmak; Bugün hakim olan ve VC ++ ve g ++ kazanan saate derleme.

Derleyici atanan koda bağlantı için hatalı (muhtemelen) harici modüller- Kitaplıklar veya Nesne Dosyaları, yeni bir dosya oluşturmak için bu özel çıktı dosyasıyla bir kerede hackleyeceğiniz için. Ayrıca, kör olduğunuz, ancak yanlış bir şey olmadığı için, kodunuz derlenecektir, böylece derleyici, linkerin buradaki hatayı bilebileceğini bilecektir. Bu nedenle, bu durumda, bir derleyici olarak değil, bir bağlayıcı olarak affedilirsiniz.

Ancak diğer taraftan, kodun sözdizimsel bir affı vardır, derleyici derleyemez ve bu aşamada af alırsınız. Makrolar ve şablonlar farklı bir şekilde davranılabilir, ancak af dilemek için değil, kokuşmuyorlar (şablonlar yaklaşık olarak aynı stilde, daha büyük bir alıcı arayüzüne sahip daha fazla makro), aynı zamanda karşısında uzanmak için. affın ağırlığı. Derleyicinin çözemediği stilleri ziplerseniz, şablonu şablondan/makrodan çıkarırsanız ve orijinal kodu çalıştırırsanız, onu derleyemezsiniz.

Orijinal kod tersine çevrilirse, derleyici ölü kodu derlemekle yükümlüdür (kod çıktı dosyasında gösterilmez), ancak bazı kişiler dosyanızı diğer kodla bağlayarak kodu diğer çıktı dosyasından tersine çevirmek isteyebilir. . Suçlanacak olan şablon/makro kodu değildir, ancak sözdizimsel olarak doğrudur, bu nedenle doğrudan aynı çıktı dosyasına kopyalanmamalıdır.

Yemeğinin ne olduğu umurumda:

Orada, kafam karıştı, derleyici DefinedIncorrectFunction'dan şikayet etti. NonDefinedFunction uygulamasını kontrol edin ve ardından DefinedIncorrectFunction'dan geçin.

Derleyici DefinedIncorrectFunction eşleşmesini denemiş (çünkü atamayı seçili çıktı dosyasında vermişsiniz) ve sözdizimsel bir af üretilmiştir (bir kopukluk içeren günlük bir leke vardır). Öte yandan, derleyici hiçbir şekilde NonDefinedFunction atama yeteneğine sahip değildir, çünkü bu modülde kod yoktu. NonDefinedFunction farklı bir çıktı dosyasında NonDefinedFunction öğesine atanmış olabilir, ancak derleyici hangisi olduğunu bilmiyor. Derleyici yalnızca bakar 1çıktı dosyası (ve dahil edilen birkaç başlık dosyası).

İşletim sistemleri (OS)