Länkning är en lågnivåuppgift som oftast är vagt specificerad, om alls, genom språkdefinitioner. Säkerheten för web bryn&s och andra extensible system beror dock på en uppsättning kontroller som måste utföras vid länktidpunkten. Med utgångspunkt i de enkla, men eleganta idéerna från Cardelli, och modulkonstruktioner från språk på hög nivå, presenterar vi en formell modell av maskinskrivna objekt jiles och en uppsättning inference regler som är tillräckliga för att garantera att typ säkerhet bevaras genom länkningsprocessen. Medan Cardellis länkkalkyl är byggd ovanpå den enkla lambdakalkylen, är våra objektfiler baserade på skrivet monteringsspråk så att vi kan modellera viktiga lågnivå implementeringsfrågor. Dessutom ger vi, till skillnad från Cardelli, stöd för abstrakta typer och högre ordning typ konstruktörer-funktioner som är kritiska för att bygga extensible system eller moderna programmeringsspråk som ML. Att länka separat sammanställda programenheter är en viktig uppgift som vanligtvis utelämnas från språkdefinitioner. Till stor del beror detta utelämnande på lågnivåarkitektur och kompilatorberoenden som verkar utanför språkdesignens område. Extensible systems [LY97, WLAG93, BSP+95, Nec97, Koz98, HCC+98] bygger dock på de starka säkerhetsgarantier som språkdefinitionerna ger. Dessa system använder länkning och lastning som en grundläggande del av sin drift, så det är viktigt att exakt definiera konsekvenskontroller en länkare, oavsett om det är statiskt eller dynamiskt, måste utföra. Till exempel, Java-extensible webbläsare, såsom Netscapes Navigator och Microsofts Internet Explorer, förlitar sig på statiska typsystem med länkkontroller för att genomdriva en bred klass av viktiga säkerhetsegenskaper. Extensions (applets) skrivs på ett språk på hög nivå som Java, och kompileras sedan av en opålitlig kompilator till ett målspråk (Java Virtual Machine bytecode). Webbläsarens integritet beror inte på typ ljudstyrka av Java, utan snarare på typ ljudstyrka (bland andra egenskaper) av JVM. Eftersom JVM stöder dynamisk länkning och laddning av appletar är en kritisk komponent i JVM-definitionen beskrivningen av välformade samlingsenheter och länkkompatibilitet. Tyvärr är denna komponent vagt specificerad och har varit en källa till väl offentliggjorda säkerhetshål [MF96, Sar97]. Nyligen föreslog Cardelli en beräkning av samlingsenheter för enkla lambda-kalculus och lade fram en uppsättning regler för att fastställa länkkompatibilitet [Car97]. Cardellis arbete specificerade högnivåabstractioner för moduler och gränssnitt, och gav en uppsättning inferensregler för att bestämma att programfragment, när de sammanställts under vissa typningsantaganden, uppfyllde en uppsättning krav på överensstämmelse som var nödvändiga för att säkerställa att det resulterande programmet var väl utformat och därför inte skulle "gå fel" när det utvärderades. I tidigare arbete presenterade vi ett Typed Assembly Language (TAL) [MWCG98] som var lämpligt för att sammanställa kärnspråk på hög nivå, och det verkade naturligt att utöka detta arbete med idéerna från Cardelli för att ge en detaljerad behandling av typsäker länkning. Även om Cardellis kalkyl är en elegant formulering "av några av de högnivåfrågor som är inblandade i länkning, fann vi att den abstraherar från många viktiga låg nivå detaljer såsom bindning och alfa-varians av etiketter, och utelämnar vissa kritiska funktioner, särskilt stöd för cykliska inter-object filreferenser, användardefinierade typ abstraktion, och dynamisk länkning. Syftet med detta dokument är därför att bygga vidare på Cardellis arbete och ge en lämplig behandling av dessa frågor. I synnerhet utökar vi kärnan TAL med ett språk av maskinskrivna objektfiler och formaliserar begreppen länkning och länkkompatibilitet. Syftet med designen var att modellera viktiga egenskaper hos konventionella objektfiler och länkar (t.ex. Unix's Id eller Win32's länk), och tillhandahålla en modulstruktur som stöder separat typkontroll av objektfiler och separat sammanställning av högkvalitativa språkfunktioner såsom abstrakta typer, signaturer, strukturer och functors av SML. Vår design för maskinskrivna objektfiler lånar mycket från det tidigare arbetet med moduler för språk på hög nivå och därför finns det relativt få viktiga innovationer. Vi anser dock att detta är en dygd eftersom det visar att programmeringsspråket har identifierat de flesta av de kritiska frågorna för alla modulspråk, och det gör att vi kan koncentrera oss på de frågor som är specifika för objektfiler. Vi har implementerat den resulterande designen som en del av ett pågående språkbaserat säkerhetsprojekt. Implementeringen ger en uppsättning verktyg för att definiera och typkontrollera en variant av IA32 (Intel 80x86) objektfiler och gränssnitt. Dessa verktyg, tillsammans med en kompilator som kartlägger en variant av typsäker C-kod till typsäkra objektfiler, finns på http: // www. cs. Det är Cornell. edu/home/walker/talnet/tal.html#talc. Vi går vidare enligt följande: I Avsnitt 2 presenterar vi abstraktioner av konventionella otypade objektfiler och länkar (t.ex. Unix's Id) och diskuterar frågorna om länkkompatibilitet i denna förenklade inställning. I avsnitt 3 går vi kort igenom typsystemet för TAL och introducerar ett enkelt modulspråk MTALo, som i Cardellis anda ger stöd för separat sammanställning, separat typkontroll och ett starkare begrepp om länkkompatibilitet. Vi utökar MTALe i sektion 4 med stöd för abstrakta typer i stil med Clu eller Modula-2, högre ordning typ konstruktörer i stil med mål Caml, och genomskinliga typer i stil med Harper och Lillibridge [HL94] och Leroy [Ler94]. Det resulterande språket, MTAL (uttalas metall), är tillräckligt uttrycksfullt att vi kan sammanställa ML-stil moduler, inklusive functors, till målspråket. Slutligen, i Avsnitt 5 diskuterar vi att utöka vår modell till att omfatta dynamisk länkning och dynamisk lastning. Vi börjar med en modell av typiska otypade objektfiler och processen att länka. Untyped Assembly Language Figur 1 Här innehåller det ursprungliga programmet en registerfil som kartlägger r2 till värdet 6, och programräknaren pekar på en instruktionssekvens där den första instruktionen är avsedd att lägga till 3 till innehållet i register r2, att placera 'Ett korrekt konto skulle behöva skilja ordvärden som kan lagras i högen eller i ett register från värden som kan vara operands (som inkluderar register). resulterar i värde i ri. Därför tar reduktionsförhållandet oss till ett program tillstånd med samma hög, en uppdaterad registerfil som kartlägger rl till värdet 9, och en uppdaterad programräknare som pekar på nästa instruktion i den sekvens som ska utföras. Abstractly, en objektfil består av tre komponenter:
Glew och Morrisett REF tar itu med problemet med säker länkning för TAL-programfragment och ger en förlängning av TAL:s typsystem som garanterar att länkning bevarar typsäkerhet.
Type-safe linking and modular assembly language
{'venue': "POPL '99", 'journal': None, 'mag_field_of_study': ['Computer Science']}