mikrocontroller.net

Forum: Compiler & IDEs Library-Handling unter "Unix"


Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

folgender Anwendungsfall:

Ich habe eine Applikation, welche Funktionalitäten mehrerer dynamisch 
gelinkter Librarys (*.so) verwendet.

Bsp.: MyApplication (executable)
      MySharedObject1 (library)
      MySharedObject2 (library)

Jedes dieser shared objects verwendet wiederum Funktionalitäten einer 
statischen Library (*.a) und wird gegen diese gelinkt. Allerdings ist 
die statische Library für jedes dieser shared objects leicht 
modifiziert, die Schnittstellen (Bezeichner von Funktionen und globalen 
Variablen) sind allerdings identisch.

Bsp.: MyApplication (executable)
      MySharedObject1 + MyStaticLib1
      MySharedObject2 + MyStaticLib2

Problem: Wenn in MySharedObject2 eine Methode der MyStaticLib2 während 
der Applikationslaufzeit aufgerufen wird und MySharedObject1 zuerst von 
der Applikation angezogen wurde, so wird die Methode aus der 
MyStaticLib1 verwendet.

Gibt es eine Möglichkeit, dem GCC (Version 3.3) dieses Verhalten 
(welches natürlich so spezifiziert ist) abzugewöhnen?


Gruß,
Alex

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Methode wäre hier, die entsprechenden Daten zu kapseln.  Du musst
also nahezu alle Funktionen als static deklarieren und sie dann über
irgendeine Registrierfunktion oder -objekt (struct) in deinen
eigentlichen Code einbinden.  Beispiele für solche Dinge sollten
sich in verschiedenen Projekten finden.

Einfach nur gleichnamige Funktionen zusammenpappen, das geht nicht
gut.

Alternativ kannst du mal gucken, ob du mit einem expliziten
dlopen()/dlclose() (statt über den dynamischen Linker und eine
zur Linkzeit bekannte Bibliothek) besser fährst.

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal hier:
http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/Functi...

Vielleicht mal mit weak oder visibility experimentieren oder 
-fvisibility. Aber das läuft wohl auf Experimente hinaus.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
weak hilft nur zur Linkzeit selbst.  Damit wird entschieden, dass
ein (non-weak) Symbol aus der Applikation Vorrang vor einem weak-
Symbol der Bibliothek bekommt, statt einen "duplicate defined
symbol"-Fehler zu erzeugen.

Autor: Alex (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

visibility = hidden schaut doch eigentlich erfolgsversprechend aus ?!

Die statische Lib mit versteckten Symbolen wird halt statisch gegen mein 
shared object gelinkt (zu diesem Zeitpunkt sollten denn auch alle 
nötigen Symbole gefunden werden, zumindest die, welche in der statischen 
Lib sind). Während der Laufzeit versucht der dynamic linker dann 
logischerweise auch nicht sämtliche Symbole neu aufzulösen und das 
shared object verwendet die Funktionen der statisch hinzu gelinkten Lib.

Korrekt?


Danke für eure Ideen,
Alex

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.