Silakan pertimbangkan kode di bawah ini

shared.c

#include <stdio.h>
void printCharArray(char *someArray){
    if (!someArray){
        printf("someArray is null!\n");
    } else {
        printf("Array is %s\n", someArray);
    }
}

Dan question.c:

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

#define LIB "/tmp/some.so"

void *handle = 0;

void localfunc();

int main(){
    handle = dlopen(LIB, RTLD_LAZY);
    if (!handle){
        fprintf(stderr, "dlopen err\n");
        exit(1);
    }
    dlerror();
    void (*printCharArray)() = dlsym(handle, "printCharArray");
    char *err = dlerror();
    if (err){
        fprintf(stderr, "%s\n", err);
        exit(1);
    }

    printCharArray(); // some work
    localfunc();
}


void localfunc(){
    puts("localfunc");
    dlerror();
    void (*printCharArray)() = dlsym(handle, "printCharArray"); // <- This 
    char *err = dlerror();
    if (err){
        fprintf(stderr, "%s\n", err);
        exit(1);
    }
    printCharArray(); // do some work in localfunc
}

Kompilasi dan jalankan

 2035  gcc -shared -o /tmp/some.so shared.c -fPIC
 2036  gcc -ldl question.c


$ ./a.out 
someArray is null!
localfunc
someArray is null!

Perhatikan bagaimana di localfunc saya memanggil dlsym lagi untuk mengimpor "printCharArray" yang sebelumnya dilakukan di main(). Saya ingin menghindari ini - bagaimana saya bisa membuat metode ini tersedia setelah impor pertama? (iow, bagaimana saya bisa membuat impor pertama saya tersedia sebagai prototipe fn untuk digunakan di mana saja di question.c?)

c
0
struggling_learner 20 Mei 2021, 04:47

1 menjawab

Jawaban Terbaik

Deklarasikan penunjuk fungsi sebagai variabel global, bukan lokal ke main().

Berikan deklarasi parameter yang benar sehingga panggilan cocok dengan definisi. Dan kemudian menyebutnya dengan argumen.

Tidak ada gunanya memanggil dlerror() sebelum memanggil dlsym(). Dan tidak ada gunanya jika Anda tidak menetapkan hasil untuk sesuatu.

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

#define LIB "/tmp/some.so"

void *handle = 0;

void localfunc();
void (*printCharArray)(char *);

int main(){
    handle = dlopen(LIB, RTLD_LAZY);
    if (!handle){
        fprintf(stderr, "dlopen err: %s\n", dlerror());
        exit(1);
    }
    printCharArray = dlsym(handle, "printCharArray");
    if (!printCharArray) {
        char *err = dlerror();
        printf(stderr, "%s\n", err);
        exit(1);
    }

    printCharArray(NULL); // some work
    localfunc();
}


void localfunc(){
    puts("localfunc");
    printCharArray("something"); // do some work in localfunc
}
2
Barmar 20 Mei 2021, 02:05