2010-06-02 10 views
6

Was ist die Verzögerung laden entspricht in Unix-basierten System.Delay-Load-Äquivalent in Unix-basierten Systemen

Ich habe einen Code foo.cpp, beim Kompilieren mit gcc verbinde ich es mit gemeinsamen Objekten (insgesamt drei .so Dateien sind da.). Jede der .so Datei für andere Option.

./foo -v Bedürfnisse libversion.so ./foo -update Bedürfnisse libupdate.so

ich das Symbol für die Bibliotheken benötigen sollten nur zur Laufzeit aufgelöst werden .

.foo -v sollte nicht brechen, auch wenn libupdate.so Bibliothek nicht da ist.

Es funktioniert in Windows mit der Option Verzögerung laden (in Eigenschaften von dll). Was ist das Gleiche in Unix-Systemen?

Wird '-lazy' Option das gleiche in UNIX ?. Wenn ja, Wo sollte diese Option enthalten sein? (in Makefile oder mit Linker ld).

Ich bin nicht gut in Unix. Bitte helfen Sie mir .. Vielen Dank im Voraus.

+1

Ich möchte noch eine Antwort auf diese Frage hören, 5 Jahre: Eine solche Unter kann von Hand, durch projektspezifische Skript oder über Implib.so tool erzeugt geschrieben werden. – Lothar

Antwort

2

Siehe die Referenz auf Ihrem System für dlopen(). Sie können Bibliotheken manuell öffnen und externe Symbole zur Laufzeit statt zur Verbindungszeit auflösen.

ausgegraben ein Beispiel:

int main(int argc, char **argv) {     
    void *handle=NULL;         
    double (*myfunc)(double);      
    char *err=NULL;         

    handle = dlopen ("/lib/libm.so.1", RTLD_LAZY); 
    if (!handle) {         
     err=dlerror(); 
     perror(err); 
     exit(1);         
    }            

    myfunc = dlsym(handle, "sin");     
    if ((err = dlerror()) != NULL) {   
     perror(err); 
     exit(1);         
    }            

    printf("sin of 1 is:%f\n", (*myfunc)(1.));    
    dlclose(handle);    
    return 0;     
}             
+1

Danke. Aber es wäre besser, wenn ich die Option Delay load äquivalent in Linker anstelle von dlopen angeben könnte. Gibt es keine Option in GCC, um die libxxx.so-Datei zu laden? Können wir gcc -WI nicht verwenden, um die Lazy-Load-Optionen zu übergeben, um den Linker für Lazy Load zu setzen? wird der Linker standardmäßig die Lazy Load setzen ?. Bitte helfen Sie mir. Vielen Dank im Voraus – saran

+1

Nein, mit dlopen()/dlsym() ist der tragbare Weg auf Unix. Einige benutzerdefinierte Linker des Systems können damit umgehen (zB: http://docs.sun.com/app/docs/doc/817-1983/6mhm6r4er?l=en&a=view), aber GNU ld hat keine solche Option. – pra

+0

@pra Wenn Sie einige Unterlagen ausgegraben haben, die Ihre Aussage unterstützen, und diese als Antwort gepostet haben, habe ich sie aufgegriffen. –

0

Ich weiß, es ist 8 Jahre gewesen, aber immer noch ...

Verzögerung Last wird nicht unterstützt auf GNU-Systemen aus der Box heraus, aber Sie können es selbst nachahmen durch Erstellen eines kleinen statischen Stubs, der alle notwendigen Symbole und dlopen s echte Implementierung beim ersten Aufruf (oder sogar beim Programmstart) zur Verfügung stellt. später

# Replace 
$ gcc -o foo foo.c -lversion 
# with 
$ gen-implib.py libversion.so 
$ gcc -o foo foo.c libversion.tramp.S libversion.init.c