17 december, 2010 (gepubliceerd)
27 oktober, 2015 (laatst gewijzigd)

Cursus “Veilig digitaal communiceren” Aflevering 4: Compiler en make

  Rubrieken: ICT
  Steekwoorden:  ,

In deze aflevering gaan we de compiler installeren. Als u weet wat een C-compiler is kan u meteen naar de sectie installeer Microsoft compiler gaan.

Inhoud

In een computer zit een processor die een zeer beperkte set van veelal wiskundige instructies kan uitvoeren. Die instructies zijn series getallen. Omdat geen mens die getallen kan onthouden en manipuleren zijn er computertalen uitgevonden: die maken het mogelijk om die instructies te genereren die woorden en wiskundige symbolen bevatten.

1. Dynamische talen (scripts)
In een scripttaal, zoals PHP, Perl, Python en Ruby (Java is een tussengeval) worden de instructies die in een programma staan regel voor regel omgezet in machinetaal en vervolgens uitgevoerd. Dat is gemakkelijk en overzichtelijk voor de programmeur, maar heeft veel nadelen:  de uitvoer kan niet worden geoptimaliseerd. Als in een script dezelfde berekening tweemaal moet worden uitgevoerd dan wordt die berekening ook echt tweemaal uitgevoerd, maar dat is één keer teveel want we weten het antwoord al. Scripttalen worden vooral gebruikt om tekstbestanden te manipuleren en om dynamische websites te genereren, dat zijn websites waarbij gegevens uit steeds veranderende gegevensbestanden steeds geactualiseerde webpagina opleveren.

2. Statische talen
Geavanceerde programma’s worden geschreven met behulp van een statische programmeertaal. Voorbeelden van die (statische) talen zijn C, C++, Pascal, en Fortran. In een dergelijke ontwikkelomgeving wordt vanuit een bronbestand, die uit leesbare tekst bestaat, na een aantal tussenstappen een uitvoerbare toepassing gegenereerd. Dat gegenereerde programma-bestand kan worden gedistribueerd en kan overal worden uitgevoerd zonder dat op de computer waar dat gebeurt de bronbestanden aanwezig zijn.

In een statische taal wordt het proces om een bestand in machinetaal te maken, gedaan in twee stappen: De statische compiler analyseert de broncode en gaat er wel een paar keer doorheen. De compiler vereenvoudigt, optimaliseert en verplaatst instructies, allemaal zonder dat de uitkomst anders zal zijn. Alleen zal de uitkomst sneller kunnen worden verkregen. Het verschil in executietijd tussen een dynamische script en een echt gecompileerd programma kan een factor duizend zijn in het voordeel van de compiler.

De eerste stap kan nog primitiever zijn. Hoe lager de taal – dat wil zeggen hoe dichter bij de machinetaal – hoe omslachtiger het wordt voor de programmeur om ermee ingewikkeldere instructies door de computer te laten uitvoeren. De laagste taal heet assembler en die wordt alleen maar gebruikt als elke efficiëntie-winst in de uitvoertijd nodig is. Die verkregen winst dient te worden afgewogen tegen de extra tijd die het kost om assembler-programma’s te schrijven. Er bestaan bijna geen programmeurs meer die in assembler kunnen programmeren. Omdat bij het versleutelen van teksten intensief gebruik wordt gemaakt van de processor is het verstandig om de executietijd van OpenSSL programma’s te minimaliseren. Om die reden heeft de  OpenSSL organisatie ervoor gekozen om C te nemen als de computertaal, terwijl ook nog een aantal zeer tijdkritische onderdelen in assembler geschreven zijn.

3. Linker
Er is nog een tweede stap nodig omdat het product van de compiler, een object-bestand, niet direct uitvoerbaar. En dat is logisch. Uw computer kan een aantal routinezaken uitvoeren, zoals lezen van schijf en schrijven naar schijf, teksten afdrukken, zoeken van bestanden. Je zou niet willen dat  elke computerprogrammeur daar allemaal weer programma’s voor zou moeten schrijven. Dat heeft de softwarefabrikant van het besturingssysteem al gedaan. En die heeft ze ook al gecompileerd tot object-bestanden, vaak gebundeld in bibliotheken (libraries).

Stel de programmeur heeft een bronbestand genaamd programma.c en dat wordt gecompileerd door de C-compiler tot het programma.obj bestand. In dat object-bestand worden een aantal functies van het besturingssysteem aangeroepen. Die heeft de compiler natuurlijk niet ingevuld, want die zijn voor elk (Windows) systeem anders en de compiler moet op veel verschillende (Windows) systemen kunnen werken. Die referenties naar systeemfuncties worden “externals” genoemd. Zolang als de object-bestanden deze externe referenties bevatten, hebben we een situatie van”unsatisfied externals”. Er is nu een ander programma, de linker genaamd – die altijd wordt meegeleverd bij de compiler – die in staat is om verschillende object-bestanden te combineren. Als alle externe referenties worden gevonden dan genereert de linker een uitvoerbaar programma. Zo niet dan geeft de linker de waarschuwing  “unsatisfied external naam-functie”. En dan weet je dat je vergeten hebt de naam van een object-bestand mee te geven aan de linker.

4. Dll’s (Dynamic Link Libraries)
Er is nog een situatie waarvoor een uitvoerbaar programma bij de uitvoering problemen kan geven. Sommige programma-onderdelen komen zo vaak voor, bijvoorbeeld een knop op een balk (tool button) dat als de linker de object-code voor die buttons overal in het programma gaat zetten, het bestand wel erg groot zou worden. Die objecten kunnen op het laatste moment, precies voordat de executie begint (on the fly) door het programma zelf opgehaald uit zgn. dll bestanden. Dat scheelt veel ruimte, want dertig programma’s die allemaal op uw computer lopen, kunnen van dezelfde dll gebruik maken.

Maar als die benodigde dll er niet is, of niet in PATH staat kan het programma niet uitgevoerd worden. Een nog groter probleem is dat nieuwer versies van een dll’s vaak niet compatiebel zijn met de oudere terwijl ze wel dezelfde naam hebben. Dit leidt tot een crash veroorzaakt door wat in het jargon heet “dll hell”. De ergste rampen met de dll-hell zijn voorbij omdat Microsoft in tegenstelling tot vroeger ontwikkelaars ten sterkste afraadt om hun dll bestanden in de syteemmappen van Windows te zetten. Benodigde dll’s worden nu door de ontwikkelaars dichtbij het programma-bestand geplaatst. En voor de nieuwe OpenSSL software, gecompileerd met de Microsoft compiler zullen we inderdaad een Microsoft dll bestand nodig hebben dat niet standaard bij het besturingssysteem wordt bijgeleverd.

De OpenSSL MS-DOS programma’s die wij gaan maken, maken gebruik van OpenSSL dll’s. Die dll’s zullen we zelf maken. Naast die dll’s en de talloze MS-DOS programma, levert de OpenSSL compilatie ook nog object files op die zijn gecombineerd in statisch bibliotheken. De OpenSSL dll’s en de statische bibliotheken zorgen ervoor dat programmeurs die de OpenSSL willen gebruiken voor hun eigen broncodes dat zonder problemen kunnen doen.

5.Welke C-compiler?
Er zijn een aantal gratis C compilers en C++ compilers. C++ is een superset van C, zodat een C++ compiler ook C-bestanden kan compileren. Een gedeelte van de gratis compilers zijn ook nog eens open source. De open source gemeenschap is Linux georiënteerd en dat wil zeggen dat de programma’s die ze ontwikkelen of alleen op Linux draaien of multi-platform zijn. De compatibiliteit met Windows is fragiel. Bij een nieuwere versie kan dat zo weer verloren gaan.

De meest voor de hand-liggende C-compiler is de multiplatform  opensource gcc-compiler. Ik heb verschillende versies gebruikt, maar het is mij nog steeds niet gelukt om de nieuwste OpenSSL versies ermee te compileren. Ik kreeg zoveel meldingen van fouten die te ingewikkeld waren om snel te kunnen repareren. Op forumdiscussies op het Internet bleek dat ik niet de enige was die deze problemen ondervond met de gcc compiler.

Een andere gratis – hoewel niet open source – compiler is de Borland C++ compiler voor Windows. Borland is een geval apart. Die firma is een paar keer van naam veranderd en heet nu Embarcadero. Met alle naamsveranderingen is de software van extreem goedkoop (TurboC) tot extreem duur (duizenden euro’s voor een compiler) verworden. Wel geeft Embarcadero een oudere versie van zijn C++ compiler gratis weg, de Borland 5.5 compiler. Oudere versies van de OpenSSL distributie heb ik inderdaad met die Borland compiler kunnen bouwen, maar dat lukte mij niet meer voor de nieuwste versie van OpenSSL. Voor de kenners: de time_b header van Borland is overjarig. De Borland compiler was al slecht in het volgen van de algemeen C++ standaard en het niet actualiseren van de compiler maakt het er niet beter op. Toch zullen we aangeven hoe u een oudere versie van OpenSSL met deze compiler kan bouwen en tevens zullen wij zo een pakket aanbieden.

6. Microsoft compiler
Microsoft was vroeger (de jaren 1990) het mikpunt van spot van programmeurs als het om de C-compiler ging, maar Microsoft heeft de compiler-business op haar eigen platform nu helemaal in handen gekregen. Dat komt omdat de producten van goede kwaliteit zijn geworden, niet duur en ook nog eens met zeer aantrekkelijke academische licenties. Met de introductie van de  succesvolle C# compiler die Java het nakijken heeft gegeven, kan geen programmeur meer om Microsoft heen.

De Microsoft C++ compiler is niet open source, dus gevaarlijk om te gebruiken voor projecten waar absolute geheimhouding bij de uitvoering, zoals bij OpenSSL, gewenst is. Maar het gevaar valt wel mee. De Microsoft compiler wordt door miljoenen programmeurs wereldwijd dagelijks gebruikt voor honderdduizenden verschillende programma’s. Een achterdeur in zo een compiler naar de CIA, NSA of Homeland Security zou allang gevonden zijn en ook tot het faillissement van Microsoft geleid hebben.

En nu het goede nieuw: de modernste versie van de Microsoft C++ compiler is gratis. U kunt hem ophalen van een Microsoft website. U dient uzelf wel te registreren, maar dat kan u zo minimaal doen dat u geen privacy-schending hoeft te vrezen.  Ik verzoek u dus om de Microsoft compiler op te halen en te installeren. Deze Microsoft compiler wordt vooral gebruikt in de grafische modus, maar dat is nu net niet hoe wij hem hier zullen gebruiken. We gebruiken hem vanuit een MS-DOS venster. Dat gaat prima, maar de werking is heel gevoelig voor de instelling van de omgevingsvariabelen zoals PATH. Ten eerste moet PATH zodanig gezet worden, als dit al niet bij het installeren automatisch gebeurd is, dat de naam van de map van de Microsoft compiler (niet hoofdmap maar map waar de programma’s staan) erin staat. Maar dat is nog niet genoeg. Dat weet Microsoft en daarom wordt er bij deze compiler een klein programmaatje geleverd, vcvars32.bat geheten, dat je moet draaien vlak voordat voordat je in datzelfde MS-DOS venster de compiler laat werken. Als je dat niet doet, crasht de compiler geheid.  Dus altijd

>vcvars32.bat

intoetsen en <ENTER> voordat je de compiler aan de gang zet. Doe het nu maar. U mag geen foutenmelding krijgen. Daarna ingeven

>cl  /?

Het antwoord in het MS-DOS venster zou nu van de Microsoft compiler cl.exe moeten komen (zie plaatje links). Zo niet, dan staat de naam van de map van de compiler toch niet goed in de  PATH omgevingsvariabele. Dat dient u te veranderen.

7. Make
Een pakket als OpenSSL heeft letterlijk duizenden bestanden waaruit we tientallen programma’s zullen bouwen: applicaties om sleutels te genereren, om certificaten te maken, om bestanden te versleutelen, om te decoderen enz.. Het is ondoenbaar om die programma’s allemaal apart met de compiler te gaan bouwen. Telkens moeten we er ook weer andere bibliotheken bij linken enz. Een nachtmerrie voor ontwikkelaars. Daarvoor is het Make programmaatje ontwikkeld. Als je make uitvoert dan wordt een speciaal bestand gelezen, een makefile. In dat tekstbestand staan alle aanwijzingen welke programma’s er allemaal gemaakt moeten worden. Daarin  staan de aanwijzingen voor de compiler en voor de linker, waaronder de namen van de locaties waar de andere benodigde object-bestanden staan. Grote software organisaties laten hun programmeurs altijd via een makefile werken. Het  Microsoft compilerpakket bevat ook een make programmaatje, nmake.exe geheten. Open een MS-DOS venster en toets in

>nmake /?

Als het goed is antwoordt de nmake met onder ander de versie (zie plaatje hiernaast). Zo niet, dan staat PATH fout of is de installatie van de compiler niet gelukt.

Voor OpenSSl is die makefile al weer zo ingewikkeld dat we weer met een andere programma die makefile maken: met Perl. Perl is namelijk heel handig om automatisch tekstbestanden te manipuleren.

De volgorde van het bouwen van de OpenSSL pakket is als volgt:

  1. Perl genereert een makefile.
  2. Het make programmaatje nmake leest die makefile en zet vervolgens voortdurend de assembler, compiler en linker aan het werk.

Als u alle PATH variabelen goed heeft gezet en Perl en de Microsoft compiler goed heeft geïnstalleerd dan is het maken van alle OpenSSL programma’s en bibliotheken een kwestie van drie kleine commando’s ingeven in een MS-DOS venster. U zult dan wel geïmponeerd raken van de vele regels die over het MS-DOS venstertje voorbijschieten en die de voortgang rapporteren. Die rapportage is nodig om bij fouten te zien waar de fout zit.

WIJ AANVAARDEN GEEN ENKEL RISICO VOOR EVENTUELE SCHADE OF ANDERE NEGATIEVE GEVOLGEN DOOR HET GEBRUIK VAN DOOR ONS GEADVISEERDE OF GEDISTRIBUEERDE SOFTWARE

De volgende aflevering van de Cursus “Veilig digitaal communiceren” zal heten: “Bouwen en installeren”.

8. Door ons gebruikte boeken

Niveau: *: geen voorkennis, **: beginnend programmeur, ***: ervaren programmeur

Print Friendly
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

Schrijf een reactie

*