I'm trying to understand how I can provide aliases to missnamed
symbols when linking libraries with gnu ld
. If I understand
correctly it should be sufficient to define an addition to the default
link script as
PROVIDE(undefined_symbol = existing_symbol);
however my minimal non-working example below does not seem to recognize
the symbol foo
which should be defined in foo.o
. Any ideas or hints what the correct link script syntax is would be
very appreciated?
foo.c:
int foo(int a) {
return a + 1;
}
foo.h:
int foo(int a);
main.c:
#include "foo.h"
#include <stdio.h>
int main(int argc, char *argv[]) {
int b = foo_(1); // calling foo_ instead of foo
printf("%d\n", b);
return 0;
}
script.ld:
PROVIDE(foo_ = foo);
compile and link:
gcc -c -o foo.o foo.c
ar rcs foo.a foo.o
gcc -I. -c -o main.o main.c
gcc main.o foo.a -o test script.ld
> /usr/bin/ld:script.ld:1: undefined symbol 'foo' referenced in expression
> nm foo.a
foo.o:
0000000000000000 T foo
> nm main.o
U foo_
U _GLOBAL_OFFSET_TABLE_
0000000000000000 T main
U printf