Ticket #8288: UndefinedWeakSymbols0.patch

File UndefinedWeakSymbols0.patch, 1.2 KB (added by hamish, 12 years ago)
  • src/system/runtime_loader/elf_symbol_lookup.cpp

    diff --git a/src/system/runtime_loader/elf_symbol_lookup.cpp b/src/system/runtime_loader/elf_symbol_lookup.cpp
    index b2f6d16..58791d0 100644
    a b resolve_symbol(image_t* rootImage, image_t* image, struct Elf32_Sym* sym,  
    523523
    524524    void* location = NULL;
    525525    if (sharedSym == NULL) {
    526         // symbol not found at all
    527         lookupError = ERROR_NO_SYMBOL;
    528         sharedImage = NULL;
     526        // undefined weak symbols get a value of 0
     527        if (ELF32_ST_BIND(sym->st_info) != STB_WEAK) {
     528            // symbol not found at all
     529            lookupError = ERROR_NO_SYMBOL;
     530            sharedImage = NULL;
     531        }
    529532    } else if (ELF32_ST_TYPE(sym->st_info) != STT_NOTYPE
    530533        && ELF32_ST_TYPE(sym->st_info)
    531534            != ELF32_ST_TYPE(sharedSym->st_info)) {
    resolve_symbol(image_t* rootImage, image_t* image, struct Elf32_Sym* sym,  
    546549    patch_undefined_symbol(rootImage, image, symName, &sharedImage, &location,
    547550        &type);
    548551
    549     if (location == NULL) {
     552    if (location == NULL && (ELF32_ST_BIND(sym->st_info) != STB_WEAK
     553            || lookupError != ERROR_UNPATCHED)) {
    550554        switch (lookupError) {
    551555            case ERROR_NO_SYMBOL:
    552556                FATAL("%s: Could not resolve symbol '%s'\n",