2017-11-13 2 views
0

Ich habe den folgenden Code, in dem die geladene gemeinsam genutzte Bibliothek als vorkompilierte Binärdatei geliefert wird. Es ist mit der Linaro Toolchain kompiliert.Warum unterbricht #define _LARGEFILE_SOURCE diese Funktionszeiger?

gbm_create_device(int fd) 
{ 
    struct gbm_device *gbm = NULL; 
    void *module; 
    const struct gbm_backend *backend = NULL 

    module = dlopen("/usr/lib/gbm/gbm_pvr.so", RTLD_NOW | RTLD_GLOBAL); 
    backend = dlsym(module, "gbm_backend"); 
    gbm = backend->create_device(fd); 

    gbm->surface_create(gbm, width, height, format, flags); 
} 

struct gbm_device { 
    /* Hack to make a gbm_device detectable by its first element. */ 
    struct gbm_device *(*dummy)(int); 

    int fd; 
    const char *name; 
    unsigned int refcount; 
    struct stat stat; 

    ... 
    void (*bo_destroy)(struct gbm_bo *bo); 

    struct gbm_surface *(*surface_create)(struct gbm_device *gbm, 
             uint32_t width, uint32_t height, 
             uint32_t format, uint32_t flags); 
    struct gbm_bo *(*surface_lock_front_buffer)(struct gbm_surface *surface); 
    ... 
}; 

Der Code funktioniert normalerweise richtig. Wenn ich jedoch die folgenden Definitionen hinzufüge, springt gbm->surface_create(...) an den falschen Speicherort in der gemeinsam genutzten Bibliothek. Warum? Es ist mir aus der official GNU page nicht ersichtlich.

#define _LARGEFILE_SOURCE 
#define _LARGEFILE64_SOURCE 
#define _FILE_OFFSET_BITS=64 

Weitere Informationen:

verwendete ich gdb den ersten Schritt nach gbm- prüfen> surface_create (...) `

Ohne diese definiert:

0xb6beb5d0 in ??() from /usr/lib/gbm/gbm_pvr.so 
... 
// Correct behavior 

Mit den Definitionen:

0xb6c414a4 in ??() from /usr/lib/gbm/gbm_pvr.so 
... 
// Segmentation fault 
+0

Können Sie eine gdb backtrace hinzufügen? – yugr

+0

@yugr Ich kann das in ein paar Stunden bekommen (habe jetzt keinen Zugriff auf das Board), aber ich habe einige zusätzliche Informationen von gdb hinzugefügt – user8908459

Antwort

5

struct gbm_device enthält ein struct stat stat; Element.

struct stat ändert sich die Größe abhängig von _LARGEFILE_SOURCE. Es enthält Mitglieder off_t st_size; usw., die 32-Bit oder 64-Bit sind.

Die Struktur in der binären kompiliert ohne _LARGEFILE_SOURCE und in Ihrem Code kompiliert mit _LARGEFILE_SOURCE sind nicht ABI-kompatibel.

Die Funktionszeiger befinden sich nach diesem Element der Struktur; Wenn Sie die Größe dieses Elements ändern, werden die offenkundigen Offsets der folgenden Elemente geändert, wobei die falschen Funktionszeigerwerte verwendet werden.

+0

Die universelle Lösung migriert auf 64-Bit –

Verwandte Themen