Linker does not detect unresolved symbol

Stern, Eli
Mon Jan 25 11:10:00 GMT 2010

In the constellation described below, the linker does not detect an unresolved symbol. This is only detected at run-time.
Seems to me the problem arises from the use of "-ffunction-sections" and "--gc-sections".

The problem was detected with the following tool releases:
- gcc 4.2.0, binutils 2.19
- gcc 3.4.6, binutils

Is this a bug or a misuse of the tools?

Suppose the following files:

a.c: This file is compiled using "-ffunction-sections", then "ar" is used to create a statis library.
extern void unresolved_detected_at_runtime_not_at_linktime(void);
void bar_in_a(void)

void call_unresolved(void)

so.c: This file is compiled to create a shared library.
extern void unresolved_detected_at_runtime_not_at_linktime(void);
void foo_in_so(void)

extern void bar_in_a();
extern void foo_in_so(void);
int main(int argc, char *argv[])

    return 0;

Note that the symbol "unresolved_detected_at_runtime_not_at_linktime" is not defined at all.

Use the following script to build:
#!/bin/bash -x
gcc -ffunction-sections -c a.c -o a.o
ar rc a.a a.o
gcc -fPIC -c so.c -o so.o
gcc -shared -o so.o
gcc -c main.c -o main.o
gcc -o main main.o -Wl,--gc-sections a.a ./

All goes well (actually, not so well, since the linker failed to detect an unresolved symbol), till we try to run the executable:

$ ./main
./main: symbol lookup error: ./ undefined symbol: unresolved_detected_at_runtime_not_at_linktime


Eli Stern

More information about the Binutils mailing list