DE202015009297U1 - Programmprodukt zum Eliminieren zusätzlicher Speicherladungen während des Zugriffs auf globale Variablen in positionsunabhängigem Code - Google Patents

Programmprodukt zum Eliminieren zusätzlicher Speicherladungen während des Zugriffs auf globale Variablen in positionsunabhängigem Code Download PDF

Info

Publication number
DE202015009297U1
DE202015009297U1 DE202015009297.7U DE202015009297U DE202015009297U1 DE 202015009297 U1 DE202015009297 U1 DE 202015009297U1 DE 202015009297 U DE202015009297 U DE 202015009297U DE 202015009297 U1 DE202015009297 U1 DE 202015009297U1
Authority
DE
Germany
Prior art keywords
global variable
global
executable
file
binary file
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
DE202015009297.7U
Other languages
English (en)
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Google LLC
Original Assignee
Google LLC
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Google LLC filed Critical Google LLC
Publication of DE202015009297U1 publication Critical patent/DE202015009297U1/de
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4434Reducing the memory space required by the program code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/443Optimisation
    • G06F8/4441Reducing the execution time required by the program code
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation

Landscapes

  • Engineering & Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Devices For Executing Special Programs (AREA)
  • Stored Programmes (AREA)

Abstract

Programmprodukt zum Reduzieren der Anzahl von Speicherladungen, die notwendig sind, um beim Erstellen einer ausführbaren Binärdatei für einen positionsunabhängigen Code auf globale Variablen zuzugreifen, wobei das Verfahren umfasst: Kompilieren des positionsunabhängigen Codes, um eine ausführbare Binärdatei zu erzeugen, wobei angenommen wird, dass globale Variablen in der ausführbaren Datei definiert sind; Identifizieren einer globalen Variablen innerhalb des positionsunabhängigen Codes; Bestimmen, ob die globale Variable in der ausführbaren Binärdatei definiert ist; und als Antwort auf das Bestimmen, dass die globale Variable nicht in der ausführbaren Binärdatei definiert ist: Erstellen einer Definition für die globale Variable in der ausführbaren Binärdatei, was den Bedarf, die Adresse der globalen Variable aus dem Speicher lädt, reduziert; und Bereitstellen der erstellten Definition für die globale Variable an ein gemeinsames Objekt oder Bibliothek.

Description

  • HINTERGRUND
  • Viele C/C++-Binärdateien werden kompiliert, positionsabhängig zu sein, was bedeutet, dass jede Binärdatei aufgebaut ist, in eine spezielle Adresse oder virtueller Adresse in einem Speicher geladen und daraus ausgeführt zu werden. Die Adressen oder virtuelle Adressen von Funktionen und globalen Variablen sind bei jedem Aufruf einer positionsabhängigen Binärdatei die gleichen. Allerdings setzt diese Positionsabhängigkeit eine Binärdatei einem Sicherheitsrisiko aus. Um diese Sicherheitsrisiken zu vermeiden, werden Binärdateien erstellt, die positionsunabhängig sind.
  • Unter Schutz gestellt werden und Gegenstand des Gebrauchsmusters sind dabei, entsprechend den Vorschriften des Gebrauchsmustergesetzes, lediglich Vorrichtungen wie in den beigefügten Schutzansprüchen definiert, jedoch keine Verfahren. Soweit nachfolgend in der Beschreibung gegebenenfalls auf Verfahren Bezug genommen wird, dienen diese Bezugnahmen lediglich der beispielhaften Erläuterung der in den beigefügten Schutzansprüchen unter Schutz gestellten Vorrichtung oder Vorrichtungen.
  • Positionsunabhängige Binärdateien können bei jedem Aufruf in unterschiedliche virtuelle Adressbereiche hineingeladen werden. Diese Technik ist bekannt als Address Space Layout Randomization (ASLR) und kann viele Sicherheitsattacken, die von der Kenntnis der Adresse einer Funktion, einem Symbol oder einer Variablen in einer speziellen Binärdatei abhängen, stoppen. Allerdings kann das Erstellen positionsunabhängiger Binärdateien nicht-triviale Leistungsprobleme verursachen. Die Verwendung konventioneller positionsunabhängiger Techniken zur Kompilierung von Binärdateien erfordert zusätzliche Speicherladevorgänge, wenn auf globale Variablen zugegriffen wird. Diese zusätzlichen Speicherladungen können Leistungsverschlechterungen bei der Ausführung von Binärdateien verursachen.
  • Wie von den Erfindern erkannt, sollte es Kompilierungstechniken geben, die die Anzahl von Speicherladungen, die erforderlich sind, um auf die globalen Variablen zuzugreifen, reduzieren, wenn ausführbare Binärdateien für einen positionsunabhängigen Code erstellt werden.
  • ZUSAMMENFASSUNG
  • Die Beschreibung beschreibt Technologien, die sich auf die Erstellung von Binärdateien im Allgemeinen und speziell auf Verfahren und Systeme zum Reduzieren der Anzahl von Speicherladungen beziehen, die erforderlich sind, um auf globale Variablen zuzugreifen, wenn ausführbare Binärdateien für einen positionsunabhängigem Code erstellt werden.
  • Allgemein kann ein Aspekt des in dieser Beschreibung beschriebenen Gegenstandes in Systemen und Verfahren zum Reduzieren der Anzahl von Speicherladungen verkörpert sein, die zum Zugriff auf globale Variablen erforderlich sind, wenn eine ausführbare Binärdatei für einen positionsunabhängigen Code erstellt wird. Ein beispielhaftes System enthält eine oder mehrere Verarbeitungsvorrichtungen und eine oder mehrere Speichervorrichtungen, die Anweisungen speichern, die, wenn sie durch die eine oder die mehreren Verarbeitungsvorrichtungen ausgeführt werden, die eine oder die mehreren Verarbeitungsvorrichtungen veranlassen, ein beispielhaftes Verfahren auszuführen. Ein beispielhaftes Verfahren enthält: Kompilieren des positionsunabhängigen Codes, um eine ausführbare Binärdatei zu erzeugen, ohne Speicherladeanweisungen zum Erhalt von Adressen globaler Variablen zu erzeugen; Identifizieren einer globalen Variablen innerhalb des positionsunabhängigen Codes; Bestimmen, ob die globale Variable in der ausführbaren Binärdatei definiert ist; und als Antwort auf das Bestimmen, dass die globale Variable nicht in der ausführbaren Binärdatei definiert ist: erstellen einer Definition für die globale Variable in der ausführbaren Binärdatei, was den Bedarf, die Adresse der globalen Variable aus dem Speicher lädt, reduziert; und Bereitstellen der erstellten Definition für die globale Variable an ein gemeinsames Objekt oder Bibliothek.
  • Ein zweites beispielhaftes Verfahren zum Reduzieren der Anzahl von Speicherladungen, die notwendig sind, um auf globale Variablen zuzugreifen, wenn eine ausführbare Binärdatei für einen positionsunabhängigen Code erstellt wird, wobei das Verfahren umfasst: Erhalten einer Liste definierter globalen Variablen aus einer instrumentierten Binärdatei des positionsunabhängigen Codes, wobei die Liste der definierten globalen Variablen globale Variablen enthält, die in der instrumentierten Binärdatei definiert sind; und Kompilieren des positionsunabhängigen Codes, um eine ausführbare Binärdatei zu erstellen mittels: Vergleichen der Liste definierter globaler Variablen mit globalen Variablen in dem positionsunabhängigen Code, und Erstellen einer Speicherladung, um Adressen von globalen Variablen aus der globalen Offset-Tabelle für nur die globalen Variablen, die nicht in der Liste der definierten globalen Variablen sind.
  • Ein drittes beispielhaftes Verfahren zum Reduzieren der Anzahl von Speicherladungen, die notwendig sind, um auf globale Variablen zuzugreifen, wenn eine ausführbare Binärdatei für einen positionsunabhängigen Code erstellt wird, wobei das Verfahren umfasst: Kompilieren des positionsunabhängigen Codes, der eine statische Verschiebung als einen Speicherladeanweisungs-Platzhalter für eine globale Variable enthält, um eine ausführbare Binärdatei zu erstellen; Bestimmen, ob die globale Variable in der ausführbaren Binärdatei definiert ist; und als Antwort auf das Bestimmen, dass die globale Variable nicht in der ausführbaren Binärdatei definiert ist, Ersetzen des statischen Verschiebungseintrags mit einer Speicherladeanweisung, um direkt die globale Variable aus der Adresse der globalen Variable zu laden.
  • Diese und andere Ausführungsformen können wahlweise eines oder mehrere der folgenden Merkmale enthalten: eine Ladeanweisung kann eine JUMP-Anweisung sein, um zu der Speicherladeanweisung zu springen, die den Inhalt der globalen Variablen lädt und darauf anspricht, dass eine globale Variable nicht in der Liste definiert ist Kann eine statische Verschiebung durch eine zwei-Anweisungen-Sequenz ersetzt werden, die die Adresse der globalen Variablen aus der globalen Offset-Tabelle lädt und dann auf den Wert der globalen Variablen durch Laden von der Adresse der globalen Variablen zugreift.
  • Die Einzelheiten einer oder mehrerer Ausführungsformen der Erfindung sind in den begleitenden Zeichnungen dargestellt, die nur zur Veranschaulichung bereitgestellt werden, und die nachfolgende Beschreibung. Weitere Merkmale, Aspekte und Vorteile der Erfindung ergeben sich aus der Beschreibung, den Zeichnungen und den Ansprüchen. Gleiche Bezugszeichen und Bezeichnungen in den verschiedenen Zeichnungen bezeichnen gleiche Elemente. Andere Merkmale, Aspekte und Vorteile der Erfindung werden aus der Beschreibung, den Zeichnungen und den Ansprüchen deutlich. Entsprechende Referenznummern und Kennzeichnungen in den verschiedenen Zeichnungen zeigen entsprechende Elemente an.
  • KURZBESCHREIBUNG DER ZEICHNUNGEN
  • 1a ist ein Beispielcode, der einen Typ einer globalen Variablen darstellt.
  • 1b ist ein Beispielcode, der einen Typ einer globalen Variablen darstellt.
  • 2 ist ein Blockdiagramm, das herkömmliche Speicherladungen zum Erhalten einer globalen Variablen darstellt.
  • 3 ist ein Beispielcode, der eine Anweisungssequenz veranschaulicht, die von einem herkömmlichen Compiler für einen positionsunabhängigen Code erzeugt wird, der eine Speicherladung zum Erfassen einer Adresse einer globalen Variablen aus einer globalen Offset-Tabelle hinzufügt.
  • 4 ist ein Flussdiagramm einer ersten Ausführungsform der Erfindung zum Reduzieren der Anzahl von Speicherladungen, die erforderlich sind, um auf globale Variablen zuzugreifen, wenn ausführbare Binärdateien für einen positionsunabhängigen Code erzeugt werden.
  • 5 ist ein Blockdiagramm, das eine herkömmliche rückgekoppelte Optimierungsschleife darstellt.
  • 6 ist ein Flussdiagramm einer zweiten Ausführungsform zum Reduzieren der Anzahl von Speicherladungen, die erforderlich sind, um auf globale Variablen zuzugreifen, wenn ausführbare Binärdateien für einen positionsunabhängigen Code erzeugt werden.
  • 7 ist ein Beispielcode, der eine Liste definierter globaler Variablen aus einer instrumentierten Binärdatei des positionsunabhängigen Codes darstellt.
  • 8 ist ein Flussdiagramm einer dritten Ausführungsform zum Reduzieren der Anzahl von Speicherladungen, die erforderlich sind, um auf globale Variablenwerte zuzugreifen, wenn ausführbare Binärdateien für einen positionsunabhängigen Code erstellt werden.
  • 9 ist ein Beispielcode, der Verschiebungsmarkierungen veranschaulicht.
  • 10 ist ein Blockdiagramm zur Veranschaulichung eines exemplarischen Computergeräts.
  • AUSFÜHRLICHE BESCHREIBUNG
  • Gemäß einer beispielhaften Ausführungsform kann die Leistungsfähigkeit einer positionsunabhängigen ausführbaren Datei verbessert werden, indem die Anzahl von Speicherladungen verringert wird, die durch einen Compiler erzeugt werden, wenn auf globale Variablen zugegriffen wird.
  • Ein Softwareprogramm kann aus zwei Teilen bestehen: dem Hauptprogramm und einem Satz von gemeinsam genutzten Bibliotheken. Eine im Programm verwendete globale Variable kann entweder in der Hauptausführungsdatei oder in einer gemeinsamen Bibliothek (oder einem gemeinsamen Objekt) definiert werden. Wenn die globale Variable in einer gemeinsamen Bibliothek oder einem Objekt definiert ist, muss sie über eine globale Offset-Tabelle referenziert werden, weil zur Kompilierzeit (wenn der Quellcode kompiliert wird) und der Verbindungszeit (wenn die Ausgabe von einer oder mehreren kompilierten Dateien verknüpft werden) die Adresse der Variablen noch nicht bekannt ist. Wenn es zwei Kopien derselben Variablen gibt, wobei eine in der Hauptausführungsdatei definiert ist und eine in einer gemeinsamen Bibliothek (oder einem Objekt) definiert ist, kann die Definition in der Hauptausführungsdatei ausgewählt werden und die Variable muss nicht durch die globale Offset-Tabelle referenziert werden. Im Quellcode gibt es jedoch keine Möglichkeit, wahrzunehmen, ob zur Kompilierzeit die Definition einer globale Variablen aus der Hauptausführungsdatei oder aus einer gemeinsam genutzten Bibliothek (oder einem Objekt) kommen wird.
  • 1a veranschaulicht ein Beispiel für eine globale Variable, die in einer Hauptausführungsdatei definiert werden wird. Beim Kompilieren kompiliert ein Compiler eine Quelldatei nach der Anderen. In diesem Beispiel kompiliert ein Compiler sowohl a.cc und b.cc. Wenn ein Compiler eine Quelldatei kompiliert, hat der Compiler keine Einsicht in andere Dateien. Daher weiß der Compiler nicht, dass ”glob_a” in b.cc definiert ist, wenn der Compiler a.cc kompiliert. Stattdessen erzeugt der Compiler zusätzliche Speicherladungen, um den Inhalt/Wert von ”glob_a” zu laden, da der Compiler nicht erkennen kann, ob eine globale Variable an anderer Stelle in der ausführbaren Datei definiert ist. Eine erste Speicherladung wird erzeugt, um die Adresse einer globalen Variablen aus einer globalen Offset-Tabelle (GOT) zu erhalten, und eine zweite Speicherladung wird erzeugt, um den Inhalt zu erhalten, der an der Adresse existiert, die dem Wert der globalen Variablen entspricht. Ein Binderprogramm, das ein Build-Werkzeug ist, das zur Bindungszeit eine oder mehrere kompilierte Dateien zusammenheftet, betrachtet alle kompilierten Quelldateien und verknüpft die Dateien, um eine ausführbare Datei zu erstellen. Daher kann das Binderprogramm klar erkennen, ob die ausführbare Datei eine bestimmte globale Variable definiert. Wenn eine Kopie der globalen Variablen in der Hauptausführungsdatei erstellt wird, kann die ausführbare Datei in einem Beispielsystem nicht verhindern, dass die globale Variable im GOT nachgeschlagen wird, da die ausführbare Datei stattdessen die Kopie der Variablen verwenden kann.
  • 1b ist eine globale Variable in einer gemeinsamen Bibliothek definiert, die in ein gemeinsam genutztes Objekt eingebaut ist. Wenn a.cc in eine ausführbare Datei kompiliert wird, definiert die ausführbare Datei nicht die globale Variable ”glob_a”, aber die gemeinsam genutzte Bibliothek, die in einem gemeinsam genutzten Objekt erstellt und verknüpft wird, definiert die globale Variable. Die hauptausführbare Datei wird dann mit dem gemeinsamen Objekt verknüpft, um die Definition von ”glob_a” zu verwenden. Zur Referenzierung auf eine Variable, zu der die Hauptausführungsdatei keine Kopie hat, wird die globale Offset-Tabelle weiterhin benötigt.
  • Beim Erzeugen einer positionsunabhängigen ausführbaren Binärdatei sind mindestens zwei Speicherladungen erforderlich, um den Wert einer globalen Variablen unter Verwendung herkömmlicher Techniken zu erhalten. Wie in 2 gezeigt, erhält eine erste Speicherladung die Adresse einer globalen Variablen aus einer globalen Offset-Tabelle (GOT) (201) und eine zweite Speicherladung erhält den Inhalt, der an der Adresse (202) existiert, der dem Wert der globalen Variablen entspricht. Herkömmliche Techniken erfordern zwei Speicherladungen für globale Variablen in einer ausführbaren Datei, obwohl globale Variablen ihren Inhalt direkt geladen haben können, ohne dass ihre Adressen erhalten werden müssen.
  • Bei positionsunabhängigem Code ist die exakte virtuelle Adresse aller globalen Variablen, auch die, die von der ausführbaren Datei definiert werden, nicht bekannt, bis die ausführbare Datei zur Ausführung geladen wird. Wenn die Adresse einer globalen Variablen bekannt ist, ist die Variable nicht positionsunabhängig. Für eine globale Variable, die durch die ausführbare Datei definiert wird, ist jedoch der Offset der globalen Variablen von ihrem Zugriffspunkt immer festgelegt. Wenn eine Funktion ”foo” auf eine in der ausführbaren Datei definierte globale Variable ”glob_a” zugreift, wird die Differenz zwischen der Adresse von ”glob_a” und der Adresse von ”foo” eine Konstante sein und der Offset kann zur Verbindungszeit bekannt sein. Die Adresse der globalen Variablen kann berechnet werden, indem der Programmzähler oder die Anweisungsadresse der Anweisung unmittelbar nach dem Zugriffspunkt des globalen zu einem gegebenen Offset addiert werden. Das Binderprogramm kann den Offset angeben und die Adresse kann zur Laufzeit korrekt sein, unabhängig davon, wo die ausführbare Datei geladen wird.
  • Wenn ein Compiler eine Quelldatei mit einer globalen Variable kompiliert, weiß der Compiler nicht, ob die globale Variable in der ausführbaren Binärdatei oder in einer gemeinsamen Bibliothek definiert werden wird. Herkömmliche Techniken fügen konservativ eine Speicherzugriffsanweisung für jede globale Variable während der Kompilierzeit für globale Variablen, die nicht in dem aktuellen Quellmodul (Datei) für den positionsunabhängigen Code kompiliert sind, hinzu, falls die Adresse einer globalen Variablen aus der globalen Offset-Tabelle geladen werden muss. 3 zeigt eine globale Variable, wobei ”a_glob” in einer Quelldatei ”foo.cc” (301) zurückgegeben wird. In diesem Beispiel kann ”a_glob” in der Quelldatei ”bar.cc” definiert werden und die Definition in die ausführbare Datei verknüpft werden, so dass die Variable schließlich in der ausführbaren Datei definiert wird. Für positionsabhängigen optimierten Code, der auf die globale Variable zugreift, kann die Adresse der Funktion ”main” 0x4005e0 sein, wie in 3 (302) gezeigt. Die globale Variable kann einen Offset von 0x1622 Bytes vom Ende dieser Anweisung aufweisen. Die Bewegungsanweisung bedeutet, dass 0x1622 dem PC (rip) der nächsten Anweisung hinzugefügt wird und der Inhalt der Adresse in das Register eax geladen wird. Für den positionsunabhängigen optimierten Code, der auf die globale Variable zugreift, ist möglicherweise die genaue Adresse der Hauptfunktion nicht bekannt, sie kann jedoch bei 0x6f0 Bytes von der Anfangsadresse der ausführbaren Datei definiert werden. Der GOT-Eintrag für die globale Variable ist bei einem Offset von 0x1609 Bytes vom Ende der ersten Anweisung. Die erste Anweisung kann den Inhalt dieses Eintrags laden, welcher die Adresse der globalen Variablen ist. Die Adresse kann geladen werden, um rax zu registrieren. Die zweite Anweisung kann auf die Inhalte der in das Register rax geladenen Adresse zugreifen und das Ergebnis, dass der Wert der globalen Variablen ist, zurück in rax speichern.
  • Bei der Verbindungszeit wird, wenn die Ausgaben einer oder mehrerer kompilierter Dateien miteinander verknüpft sind, ein Compiler-Tool wissen, wo jede globale Variable definiert ist, da der Verknüpfungsprozess alle vom Compiler erzeugten Objektdateien aus den Quelldateien sieht und weiß, wo globale Variablen definiert sind. Folglich kann bestimmt werden, ob eine zusätzliche Speicherladung erforderlich ist, um einen Wert der globalen Variablen bei der Einbindungszeit zu erhalten. Jedoch ist es zu diesem Zeitpunkt in dem Prozess zu spät, zusätzliche Speicherzugriffe zu entfernen, obwohl für globale Variablen, die in der ausführbaren Datei definiert sind, keine zusätzliche Speicherladung erforderlich ist, da der Compiler bereits die Anweisungen für die zusätzliche Speicherladung hinzugefügt hat und das Binderprogramm nicht die Fähigkeit hat, wesentliche Änderungen an Anweisungen vorzunehmen oder Anweisungen zu entfernen, die vom Compiler hinzugefügt wurden. Das Binderprogramm kann nur Anweisungen entsprechend der Semantik des zugehörigen Verschiebungseintrags für die Anweisung ändern.
  • Das Annotieren globaler Variablen im Quellcode ist eine herkömmliche Technik, um unnötige Speicherladungen zu vermeiden. Die globalen Variablen können so annotiert werden, ob sie in einem gemeinsamen Objekt oder in einer ausführbaren Datei definiert sind. Allerdings macht diese Annotation den Code weniger flexibel in Bezug auf die Art, wie er aufgebaut werden kann und verursacht auch Code-Wartungsprobleme.
  • Um unnötige Speicherladungen zu vermeiden, kann ein beispielhaftes Kompilierwerkzeug eine von mehreren beispielhaften Techniken verwenden. In einer Ausführungsform kann ein Binderprogramm Definitionen in der ausführbaren Datei für globale Variablen erstellen, die nicht durch die ausführbare Datei definiert sind. Wie oben diskutiert, ist ein Binderprogramm ein Erstellungswerkzeug, das bei der Einbindungszeit eine oder mehrere kompilierte Dateien zusammenheftet. Der Verbindungsschritt wird durch Bereitstellen einer Liste von vom Compiler erzeugten Objektdateien (aus dem Kompilieren der Quelldateien) und von einem Satz aus gemeinsamen Objekten, die die ausführbare Datei referenzieren sollte, aufgerufen. Das Binderprogramm setzt diese Objektdateien zusammen, um die ausführbare Datei zu bilden. Als Teil dieses Einbindungsschritts löst das Binderprogramm Verweise auf eine beliebige globale Variable auf. Wenn auf eine globale Variable durch eine ausführbare Datei zugegriffen wird, versucht das Binderprogramm sicherzustellen, dass eine Definition für die globale Variable existiert. Das Binderprogramm stellt fest, ob eine globale Variable in der ausführbaren Datei definiert ist oder ob die Definition aus einem der gemeinsamen Objekte (Bibliotheken) stammt, die mit der Einbindungsanweisung bereitgestellt werden.
  • Wenn das Binderprogramm sieht, dass die globale Variable in einem gemeinsam genutzten Objekt definiert ist, erstellt das Binderprogramm eine Kopie der globalen Variablen in der ausführbaren Datei und erstellt entsprechend der globalen Variablen eine Kopie-Verschiebungsanweisung. Zur Laufzeit wird die Kopie der globalen Variablen in der ausführbaren Datei anstelle der ursprünglichen Definition im gemeinsamen Objekt verwendet. Die Kopie-Verschiebung, die erstellt wurde, stellt sicher, dass alle Initialisierungen, die im gemeinsam genutzten Objekt für die globale Variable aufgetreten sind, korrekt in der in der ausführbaren Binärdatei enthaltenen Kopie widergegeben werden.
  • Unter Verwendung dieser Technik weiß der Compiler sicher, dass jede globale Variable durch die ausführbare Datei definiert wird und daher keine zusätzliche Speicherladung zum Erhalten der Adresse jeder globalen Variablen hinzufügen. Wenn der Compiler aufgefordert wird, einen positionsunabhängigen Code für eine ausführbare Datei zu erzeugen, darf der Compiler keine zusätzlichen Speicherladungen für globale Variablen erzeugen. Stattdessen kann der Compiler unter der Annahme, dass globale Variablen in der ausführbaren Datei definiert sind, Code generieren. Da der Compiler keine zusätzlichen Speicherladungen für Adressen globaler Variablen während der Kompilierzeit hinzufügt, benötigt diese beispielhafte Technik anstelle von zwei nur eine Speicherladung pro globaler Variable, um Variablenwerte zu erhalten.
  • Eine beispielhaftes Verfahren beginnt mit dem Kompilieren eines positionsunabhängigen Codes, um eine ausführbare Binärdatei zu erzeugen, ohne Speicherladungen zum Erhalten globaler Variablenadressen zu erzeugen, wie dargestellt in 4 (403). Eine globale Variable kann innerhalb des positionsunabhängigen Codes (405) identifiziert werden, und es kann bestimmt werden, ob die globale Variable in der ausführbaren Binärdatei (407) definiert ist. Ob die globale Variable in der ausführbaren Binärdatei definiert ist, hängt davon ab, welche Technik verwendet wird. Beim Verwenden der Kopier-Verschiebungstechnik werden globale Variablen immer in der ausführbaren Datei definiert. Wenn die globale Variable nicht in der ausführbaren Binärdatei definiert ist, kann eine Definition für die globale Variable in der ausführbaren Binärdatei erstellt werden, wodurch die Notwendigkeit verringert wird, die Adresse der globalen Variablen aus dem Speicher zu laden. Die ausführbare Datei kann Datenabschnitte aufweisen, die verschiedene globale Variablen definieren. Eine Definition kann in der ausführbaren Datei erzeugt werden, indem genügend Bytes an Speicher beim nächsten verfügbaren Adressen-Offset reserviert werden, beispielsweise 0xafbc im Datenabschnitt, um die gesamte Größe der globalen Variablen im Datenabschnitt zu halten. Auf die globale Variable kann über diese Adresse (Offset) zugegriffen werden. Die ausführbare Symboltabelle kann dann diese Information bezüglich der Offset-Adresse der globalen Variable exportieren. Die erzeugte Definition für die globale Variable kann dann einem gemeinsamen Objekt oder einer gemeinsamen Bibliothek (409) zur Verfügung gestellt werden.
  • Eine zweite Ausführungsform kann das Übergeben einer Liste definierter globaler Variablen umfassen, anstatt die Variablen zur Kompilierzeit oder Verbindungszeit zu definieren. Viele leistungskritische Binärdateien und andere Binärdateien werden mit einer Rückkopplungsoptimierung kompiliert. Rückkopplungsorientierte Optimierung (FDO) ist eine Technik, die verwendet wird, um Anwendungsausführungen basierend auf dem Anwendungslaufzeitverhalten zu optimieren, um die Leistung zu verbessern. FDO ist auch als Profilgeführte Optimierung (PGO) und profilbasierte Optimierung (PBO) bekannt. Zur Abstimmung der Anwendungen führt die FDO eine Profilierung auf den Anwendungen durch. Profiling bezeichnet das Sammeln von Informationen über das Laufzeitverhalten einer Anwendung. Diese Profilinformationen werden bei verschiedenen Anwendungsoptimierungen dazu verwendet, die richtige Entscheidung zu treffen.
  • Wie in 5 dargestellt, ist die übliche rückkopplungsorientierte Optimierung eine Dual-Build-Modelltechnik, die eine statische Instrumentierung verwendet, um Rand- und Wertprofile zu sammeln. Ein Instrumentationsaufbau (501) ermöglicht es dem Compiler, Code in eine Binärdatei einer Anwendung einzufügen, um eine instrumentierte Version der Binärdatei (502) zu erzeugen. Der eingefügte Code zählt normalerweise die Kanten und erkennt die Wertprofile. Die instrumentierte Binärdatei (502) wird auf einem repräsentativen Satz von Trainingsdaten (504) in einem Trainingslauf (503) ausgeführt. Am Ende der Trainingsausführung werden alle gesammelten Randzählwerte und Wertinformationen in eine Profildatenbank oder gcov-Datendatei (GCDA) (505) geschrieben und aggregiert. Ein Optimierungs-Build (506) tritt dann auf, wenn der Compiler das erzeugte Profil verwendet, um Optimierungsentscheidungen wie Inline-Entscheidungen, Anweisungsplanung, Basisblockrückanordnung, Funktionsteilung und Registerzuteilung zu treffen.
  • Da die instrumentierte und optimierte Binärdatei aus denselben Quellen erstellt wird, ist die Liste der globalen Variablen, die in und außerhalb dieser beiden ausführbaren Dateien definiert sind, dieselbe. Aus diesem Grund kann die Liste der globalen Variablen, die aus der instrumentierten Binärdatei definiert wurde, an den Compiler, der die optimierte Binärdatei erstellt, weitergeleitet werden. Der Compiler kennt dann die Liste der globalen Variablen, die von der ausführbaren Datei definiert werden, und darf nur die zusätzlichen Speicherladungen für globale Variablen generieren, die sich nicht auf der definierten Liste der Variablen befinden.
  • Ein beispielhaftes Verfahren beginnt mit dem Empfangen einer Liste von definierten globalen Variablen aus einer instrumentierten Binärdatei des positionsunabhängigen Codes, wie in 6 (601) dargestellt. Die Liste der definierten globalen Variablen kann globale Variablen enthalten, die in der instrumentierten Binärdatei definiert sind. Der positionsunabhängige Code kann dann kompiliert werden. Während der Kompilierung kann die Liste der definierten globalen Variablen mit globalen Variablen im positionsunabhängigen Code (607) verglichen werden. Speicherladeanweisungen können erstellt werden, um Adressen globaler Variablen aus der globalen Offset-Tabelle für die globalen Variablen zu laden, die sich nicht in der Liste der definierten globalen Variablen befinden (609). 7 zeigt einen beispielhaften Code und eine Liste definierter globaler Variablen aus einer instrumentierten Binärdatei des positionsunabhängigen Codes. Die Liste der Variablen aus der instrumentierten Binärdatei kann an die optimierte Binärdatei übergeben werden. Wie in 7 gezeigt, können Variablen in der ausführbaren Datei wie ”glob_a” und ”glob_b” definiert werden oder sie können in einem gemeinsamen Objekt wie ”glob_shared” definiert werden. GOT-Zugriff darf nur für globale Variablen generiert werden, die in gemeinsamen Objekten definiert sind.
  • Eine dritte Ausführungsform enthält das Verwenden einer speziellen Verschiebung, um globale Variablen zu markieren, und die Binderprogramm-Patch-Anweisungen in geeigneter Weise vorliegen zu haben, wenn diese die Verschiebung verarbeitet, basierend darauf, ob eine globale Variable in der ausführbaren Binärdatei oder in einem gemeinsamen Objekt/in einer gemeinsamen Bibliothek definiert ist. Ein beispielhaftes Verfahren kann mit dem Kompilieren eines positionsunabhängigen Codes beginnen, bei dem eine statische Markierung vom Verschiebungstyp als Speicheranweisungsplatzhalter für eine globale Variable enthalten ist, um eine ausführbare Binärdatei zu erzeugen, wie in 8 (801) dargestellt. Ein Compiler kann für jede Anweisung, die auf eine externe globale Variable verweist, die nicht in dem Quellmodul (oder der Datei) das kompiliert wird, definiert ist, eine spezielle neu definierte Verschiebung generieren. Ein Beispiel einer speziellen Verschiebung kann so definiert werden, dass, wenn das Compiler-Werkzeug der Anweisung mit dieser speziellen Verschiebung begegnet, das Binderprogramm angewiesen wird, die Anweisungen zu reparieren. Für jeden globalen Variablenzugriff kann der Compiler eine Anweisung mit der neu definierten Verschiebung erzeugen, um den Zugriff auf eine bestimmte globale Variable zu bezeichnen. Wenn das Binderprogramm diese Verschiebung in einer Anweisung verarbeitet, die auf eine globale Variable zugreift, kann das Binderprogramm bestimmen, wo die globale Variable definiert ist (803). Wenn die globale Variable durch die ausführbare Datei definiert ist, kann das Binderprogramm die Verschiebung ersetzen, um die globale Variable direkt aus der Adresse (805) der Variablen zu laden. Wenn die globale Variable in einem gemeinsam genutzten Objekt definiert ist, kann das Binderprogramm die Verschiebungsanweisung ersetzen, um eine zwei-Anweisungen-Sequenz aufzurufen, die die globale Variablenadresse aus dem GOT lädt und dann durch Laden aus der Adresse (805) der globalen Variablen auf den Wert der globalen Variablen zugreift.
  • 9 zeigt ein Beispiel für die Verwendung dieses speziellen Verschiebungstyps. Wie in 8 gezeigt, kann eine Quellcode-Datei foo.cc vorhanden sein, die in eine ausführbare Datei eingebaut wird. Bei der speziellen Verschiebung kann der Assembler-Code in foo.s vor dem Aufruf des Binderprogramms eine Markierung für die globale Variable ”a_glob” (902) enthalten. GLOBAL_ACCESS (a_glob) ist die Darstellung für die neu erstellte Verschiebung, die das Binderprogramm verarbeiten muss. Diese Anweisung sagt, dass der Wert von ”a_glob” schließlich im Register eax gespeichert wird. Zur Verbindungszeit kann es eine aus zwei Situationen geben; entweder wird die globale Variable ”a_glob” in der ausführbaren Datei über eine andere Objektdatei definiert oder ”a_glob” wird in einem gemeinsamen Objekt definiert. Wenn die globale Variable in der ausführbaren Binärdatei definiert ist, kann der globale Zugriff in der ausführbaren Binärdatei nur zu einer Anweisung (903) werden. Wenn die globale Variable in einem gemeinsamen Objekt definiert ist, kann der globale Zugriff in der ausführbaren Datei zu zwei Anweisungen (904) werden,
  • 10 ist ein Blockdiagramm auf übergeordneter Ebene eines beispielhaften Computers (1000), der eingerichtet ist, ausführbare Binärdateien zu erzeugen. In einer absoluten Basiskonfiguration (1001) umfasst das Computergerät (1000) typischerweise einen oder mehrere Prozessoren (1010) und Systemspeicher (1020). Ein Speicherbus (1030) kann für die Datenübertragung zwischen dem Prozessor (1010) und dem Systemspeicher (1020) verwendet werden.
  • Abhängig von der gewünschten Konfiguration kann der Prozessor (1010) von irgendeinem Typ sein, einschließlich, aber nicht beschränkt auf einen Mikroprozessor (μP), einen Mikrocontroller (μC), einen digitalen Signalprozessor (DSP) oder eine beliebige Kombination davon. Der Prozessor (1010) kann ein- oder mehrstufiges Cachen, zum Beispiel einen Cache der Stufe 1 (1011) und einen der Stufe 2 (1012), einen Prozessorkern (1013) sowie Register (1014) umfassen. Der Prozessorkern (1013) kann eine arithmetisch-logische Einheit (ALU, arithmetic logic unit), einen Gleitkommaprozessor (FPU, floating point unit), einen digitalen Signalverarbeitungskern (DSP Core, digital signal processing core), oder eine beliebige Kombination davon enthalten. Ein Speichercontroller (1016) kann ebenfalls mit dem Prozessor (1010) verwendet werden oder in bestimmten Implementierungen kann der Speichercontroller (1015) einen integralen Teil des Prozessors (1010) bilden.
  • Abhängig von der gewünschten Konfiguration kann der Systemspeicher (1020) von beliebigem Typ sein, einschließlich, aber nicht beschränkt auf flüchtige Speicher (wie etwa RAM), nichtflüchtige Speicher (wie etwa ROM, Flash-Speicher usw.) oder irgendeine Kombination davon. Ein Systemspeicher (1020) umfasst typischerweise ein Betriebssystem (1021), eine oder mehrere Anwendungen (1022) und Programmdaten (1024). Die Anwendung (1022) kann ein Verfahren zum Reduzieren der Speicherladungen enthalten, die erforderlich sind, um auf globale Variablen zuzugreifen, wenn ausführbare Binärdateien erstellt werden. Die Programmdaten (1024) enthalten das Speichern von Anweisungen, die, wenn sie von der einen oder mehreren Verarbeitungsvorrichtungen ausgeführt werden, ein Verfahren zur binären Erzeugung implementieren. (1023). In einigen Ausführungsformen kann die Anwendung (1022) so angeordnet werden, dass sie mit Programmdaten (1024) in einem Betriebssystem (1021) funktioniert.
  • Die Rechenvorrichtung (1000) kann zusätzliche Merkmale oder Funktionalität und zusätzliche Schnittstellen aufweisen, um die Kommunikation zwischen der Grundkonfiguration (1001) und allen erforderlichen Vorrichtungen und Schnittstellen zu erleichtern.
  • Der Systemspeicher (1020) ist ein Beispiel für Computerspeichermedien. Computer-Speichermedien umfassen Folgendes, ohne jedoch darauf beschränkt zu sein: RAM, ROM, EEPROM, Flash-Speicher oder eine andere Speichertechnologie, CD-ROM, DVD oder einen anderen optischen Speicher, Magnetkassette, Magnetband, Magnetdiskspeicher oder andere Magnetspeichergeräte sowie weitere Medien, die zur Speicherung der gewünschten Daten benutzt werden können und mittels des Computergeräts (1000) zugänglich sind. Jedes solches Computer-Speichermedium kann Teil des Geräts (1000) bilden.
  • Die Rechenvorrichtung (1000) kann als Teil eines mobilen elektronischen Geräts mit kleinem Formfaktor, wie z. B. ein Mobiltelefons, ein Smartphones, ein persönlicher Datenassistent (PDA), eine persönliche Medienabspielvorrichtung, einer Tablet, ein drahtloses Web-Watch-Gerät, ein persönliches Headset-Gerät, ein anwendungsspezifisches Gerät oder ein Hybrid-Gerät, das eine der oben genannten Funktionen enthält, implementiert sein. Das Computergerät (1000) kann auch als PC (Personal Computer) einschließlich Laptop- und Nicht-Laptop-Computerkonfigurationen ausgeführt werden.
  • Die vorstehende detaillierte Beschreibung hat verschiedene Ausführungsformen der Vorrichtungen und/oder Prozesse mittels der Verwendung von Blockdiagrammen, Flussdiagrammen und/oder Beispielen dargelegt. Insoweit wie solche Blockdiagramme, Flußcharts und/oder Beispiele eine oder mehrere Funktionen und/oder Operationen beinhalten, werden sie verstanden von denen in der Wissenschaft, das jede Funktion und/oder Operation mit solchen Blockdiagrammen, Flußcharts oder Beispielen implementiert werden können, individuell und/oder kollektiv, durch ein weites Angebot von Hardware, Software, Firmware der irgendeiner virtuellen Kombination davon. In einer Ausführungsform können mehrere hierin beschriebene Abschnitte des Gegenstandes über anwendungsspezifische integrierte Schaltungen (ASICs), feldprogrammierbare Gate-Arrays (FPGAs), digitale Signalprozessoren (DSPs), andere integrierte Formate oder als Web-Service implementiert sein. Dennoch werden die Fachkundigen feststellen, dass einige Aspekte der hier dargelegten Ausführungen, teilweise oder gänzlich, ebenso in integrierten Kreisläufen implementiert werden können, als ein oder mehrere Computerprogramme, die auf einem oder mehreren Computer ausgeführt werden, als ein oder mehrere Programme, die auf einem oder mehreren Prozessoren ausgeführt werden, als Firmware oder irgend eine Kombination davon; und dass ein Entwurf der Kreisläufe und/oder des Schreibens des Codes für die Software und/oder Firmware unter Berücksichtigung der vorliegenden Veröffentlichung eine große Leistung wäre. Darüber hinaus wird der Fachmann anerkennen, dass die Mechanismen des hierin beschriebenen Gegenstands in der Lage sind, als ein Programmprodukt in einer Vielzahl von Formen verbreitet zu werden, und dass eine anschauliche Ausführungsform des hierin beschriebenen Gegenstands unabhängig von dem speziellen Typ des nicht transitorischen signaltragenden Mediums, das verwendet wird, um die Verbreitung durchzuführen, anwendbar ist. Beispiele für ein nicht-transitorisches Signal tragenden Mediums umfassen, ohne Einschränkung darauf, Folgendes: Floppy Disk, Festplattenlaufwerk, CD (Compact Disc), DVD (Digital Video Disk), digitales Band, Computerspeicher usw.; sowie ein Medium des Übertragungstyps, wie beispielsweise ein digitales und/oder analoges Kommunikationsmedium. (z. B. ein Glasfaserkabel, ein Wellenleiter, eine kabelgebundene Kommunikationsverbindung, eine kabellose Kommunikationsverbindung usw.)
  • Hinsichtlich der Verwendung von im Wesentlichen jeden mehrfachen und/oder singulären Ausdrücken kann der Fachmann aus dem Plural in den Singular und/oder aus dem Singular in den Plural übersetzen, wie dies für den Kontext und/oder die Anwendung geeignet ist. Die verschiedenen Einzahl/Mehrzahl Permutationen können hier ausgedrückt werden aus Gründen der Klarheit.
  • Folglich wurden bestimmte Ausführungsformen des Gegenstands beschrieben. Weitere Ausführungsformen gehören zum Umfang der folgenden Ansprüche. In einigen Fällen können die in den Ansprüchen beschriebenen Handlungen in einer anderen Reihenfolge durchgeführt werden und dennoch erwünschte Ergebnisse erzielen. Zusätzlich erfordern die in den beigefügten Figuren dargestellten Prozesse nicht notwendigerweise die bestimmte gezeigte Reihenfolge oder aufeinanderfolgende Reihenfolge, um erwünschte Ergebnisse zu erzielen. In bestimmten Implementierungen können Multitasking und eine Parallelbearbeitung vorteilhaft sein.

Claims (1)

  1. Programmprodukt zum Reduzieren der Anzahl von Speicherladungen, die notwendig sind, um beim Erstellen einer ausführbaren Binärdatei für einen positionsunabhängigen Code auf globale Variablen zuzugreifen, wobei das Verfahren umfasst: Kompilieren des positionsunabhängigen Codes, um eine ausführbare Binärdatei zu erzeugen, wobei angenommen wird, dass globale Variablen in der ausführbaren Datei definiert sind; Identifizieren einer globalen Variablen innerhalb des positionsunabhängigen Codes; Bestimmen, ob die globale Variable in der ausführbaren Binärdatei definiert ist; und als Antwort auf das Bestimmen, dass die globale Variable nicht in der ausführbaren Binärdatei definiert ist: Erstellen einer Definition für die globale Variable in der ausführbaren Binärdatei, was den Bedarf, die Adresse der globalen Variable aus dem Speicher lädt, reduziert; und Bereitstellen der erstellten Definition für die globale Variable an ein gemeinsames Objekt oder Bibliothek.
DE202015009297.7U 2014-05-01 2015-04-07 Programmprodukt zum Eliminieren zusätzlicher Speicherladungen während des Zugriffs auf globale Variablen in positionsunabhängigem Code Active DE202015009297U1 (de)

Applications Claiming Priority (2)

Application Number Priority Date Filing Date Title
US14/267,705 US9213531B2 (en) 2014-05-01 2014-05-01 Methods to eliminate extra memory loads while accessing global variables in position independent code
US14/267,705 2014-05-01

Publications (1)

Publication Number Publication Date
DE202015009297U1 true DE202015009297U1 (de) 2017-01-26

Family

ID=53016750

Family Applications (1)

Application Number Title Priority Date Filing Date
DE202015009297.7U Active DE202015009297U1 (de) 2014-05-01 2015-04-07 Programmprodukt zum Eliminieren zusätzlicher Speicherladungen während des Zugriffs auf globale Variablen in positionsunabhängigem Code

Country Status (3)

Country Link
US (1) US9213531B2 (de)
DE (1) DE202015009297U1 (de)
WO (1) WO2015167763A1 (de)

Families Citing this family (7)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR101757407B1 (ko) * 2015-06-11 2017-07-12 라인 가부시키가이샤 바이너리 병합 장치, 방법 및 컴퓨터 프로그램
US10037194B2 (en) * 2016-01-22 2018-07-31 American Express Travel Related Services Company, Inc. Systems and methods for visual data management
US10268601B2 (en) 2016-06-17 2019-04-23 Massachusetts Institute Of Technology Timely randomized memory protection
US10310991B2 (en) * 2016-08-11 2019-06-04 Massachusetts Institute Of Technology Timely address space randomization
CN110688320B (zh) * 2019-09-30 2023-05-23 潍柴动力股份有限公司 全局变量的检测方法、装置及终端设备
US11055202B1 (en) * 2019-12-16 2021-07-06 Nxp B.V. Compilation scheme for tagged global variables
CN111580798B (zh) * 2020-03-30 2023-06-06 佛山职业技术学院 一种动态链接库实现方法、系统、计算机设备及存储介质

Family Cites Families (15)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5704053A (en) * 1995-05-18 1997-12-30 Hewlett-Packard Company Efficient explicit data prefetching analysis and code generation in a low-level optimizer for inserting prefetch instructions into loops of applications
US5923882A (en) * 1995-08-29 1999-07-13 Silicon Graphics, Inc. Cross-module optimization for dynamically-shared programs and libraries
US5940621A (en) * 1996-01-23 1999-08-17 Hewlett-Packard Company Language independent optimal size-based storage allocation
US6735758B1 (en) * 2000-07-06 2004-05-11 International Business Machines Corporation Method and system for SMP profiling using synchronized or nonsynchronized metric variables with support across multiple systems
US7237234B2 (en) * 2001-12-13 2007-06-26 Texas Instruments Incorporated Method for selective solicitation of user assistance in the performance tuning process
US7627861B2 (en) * 2003-12-05 2009-12-01 The University Of North Carolina Methods, systems, and computer program products for identifying computer program source code constructs
CN101278262A (zh) * 2004-08-12 2008-10-01 桑德布里奇技术公司 非循环的指令模式的识别方法
US7530059B2 (en) * 2005-02-18 2009-05-05 International Business Machines Corporation Method for inlining native functions into compiled java code
US7849453B2 (en) * 2005-03-16 2010-12-07 Oracle America, Inc. Method and apparatus for software scouting regions of a program
US8087010B2 (en) * 2007-09-26 2011-12-27 International Business Machines Corporation Selective code generation optimization for an advanced dual-representation polyhedral loop transformation framework
US8239841B2 (en) * 2008-04-04 2012-08-07 International Business Machines Corporation Prefetching irregular data references for software controlled caches
CN101441566B (zh) * 2008-11-18 2012-04-25 腾讯科技(深圳)有限公司 一种在嵌入式平台上动态链接程序的方法
US9009689B2 (en) * 2010-11-09 2015-04-14 Intel Corporation Speculative compilation to generate advice messages
US8869127B2 (en) * 2011-01-03 2014-10-21 International Business Machines Corporation Refactoring programs for flexible locking
US20140068581A1 (en) * 2012-08-30 2014-03-06 International Business Machines Corporation Optimized division of work among processors in a heterogeneous processing system

Also Published As

Publication number Publication date
WO2015167763A1 (en) 2015-11-05
US9213531B2 (en) 2015-12-15
US20150317139A1 (en) 2015-11-05

Similar Documents

Publication Publication Date Title
DE202015009297U1 (de) Programmprodukt zum Eliminieren zusätzlicher Speicherladungen während des Zugriffs auf globale Variablen in positionsunabhängigem Code
DE112012003716B4 (de) Erzeugen von kompiliertem Code, der Registeraktivität angibt
DE112013001711T5 (de) Optimieren von Unterroutine-Aufrufen auf der Grundlage der Architekturebene einer aufgerufenen Unterroutine
DE202014010942U1 (de) Rahmenumgebung für anwenderorientierte, profilgesteuerte Optimierungen
DE112012003780T5 (de) Verknüpfen von Code für eine erweiterte binäre Anwendungsschnittstelle (Application binary Interface (ABI)) mit Entschlüsselungszeit-Anweisungsoptimierung
DE112012003714T5 (de) Kompilieren von Code für eine erweiterte binäre Anwendungsschnittstelle (Application binary interface (ABI)) mit Entschlüsselungszeit-Anweisungsoptimierung
DE69911468T2 (de) Verfahren zum direkten inlinen von virtuellen anrufen ohne on-stack-vertretung
EP1723513B1 (de) Verfahren zur konfiguration eines computerprogramms
DE10393481T5 (de) Verfahren und Vorrichtung zum Durchführen einer Cache-Umgehung
DE102016214786A1 (de) Anwendungsprofiling-Jobmanagement-System, -Programm und -Verfahren
EP1738257B1 (de) Verfahren zum vermeiden von dateninkonsistenz zwischen zugriffen verschiedener funktionen einer anwendung auf eine globale variable in einer datenverarbeitungsanlage
DE202014010938U1 (de) Omega-Namen: Namenserzeugung und -ableitung
DE112013001747T5 (de) Optimieren des Verbindens von Anweisungen
DE112013001735T5 (de) Optimieren des Verbindens von Anweisungen
DE112012000303T5 (de) Dynamische binäre Optimierung
DE102012224363A1 (de) Informationsverarbeitungssystem mit Hardware- und Softwarevorablesezugriff
DE202014010926U1 (de) Ein System zur Modellierung von Quellcode mit Codesegmenten, denen der Quellort fehlt
DE102019109050A1 (de) Compiler-übersetzung mit schleifen- und datenpartitionierung
DE102013200508A1 (de) Ersetzungsreihenfolge von Cache-Sets auf der Grundlage von zeitbezogener Set-Aufzeichnung
DE202016007893U1 (de) Systeme zum Entfernen von PLT-Stubs aus dynamisch verknüpften Binärdateien
DE102016223939A1 (de) Parallelisierungsverfahren, Parallelisierungswerkzeug und fahrzeugeigene Vorrichtung
DE202016007872U1 (de) Eine feinkörnige, anforderungsabhängige IPO Infrastruktur
DE102017210126A1 (de) Parallelisierungsverfahren, Parallelisierungswerkzeug und fahrzeuginterne Vorrichtung
Tolvanen MetaEdit+ for collaborative language engineering and language use (tool demo)
DE112018002316T5 (de) Codeabdeckungsverfolgung für ein mikrocontroller-programm

Legal Events

Date Code Title Description
R207 Utility model specification
R081 Change of applicant/patentee

Owner name: GOOGLE LLC (N.D.GES.D. STAATES DELAWARE), MOUN, US

Free format text: FORMER OWNER: GOOGLE INC., MOUNTAIN VIEW, CALIF., US

R082 Change of representative

Representative=s name: BETTEN & RESCH PATENT- UND RECHTSANWAELTE PART, DE

R079 Amendment of ipc main class

Free format text: PREVIOUS MAIN CLASS: G06F0009450000

Ipc: G06F0008410000

R150 Utility model maintained after payment of first maintenance fee after three years
R151 Utility model maintained after payment of second maintenance fee after six years
R152 Utility model maintained after payment of third maintenance fee after eight years