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,
|
523 | 523 | |
524 | 524 | void* location = NULL; |
525 | 525 | 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 | } |
529 | 532 | } else if (ELF32_ST_TYPE(sym->st_info) != STT_NOTYPE |
530 | 533 | && ELF32_ST_TYPE(sym->st_info) |
531 | 534 | != ELF32_ST_TYPE(sharedSym->st_info)) { |
… |
… |
resolve_symbol(image_t* rootImage, image_t* image, struct Elf32_Sym* sym,
|
546 | 549 | patch_undefined_symbol(rootImage, image, symName, &sharedImage, &location, |
547 | 550 | &type); |
548 | 551 | |
549 | | if (location == NULL) { |
| 552 | if (location == NULL && (ELF32_ST_BIND(sym->st_info) != STB_WEAK |
| 553 | || lookupError != ERROR_UNPATCHED)) { |
550 | 554 | switch (lookupError) { |
551 | 555 | case ERROR_NO_SYMBOL: |
552 | 556 | FATAL("%s: Could not resolve symbol '%s'\n", |