What is the proper ld link script syntax for aliasing missnamed symbols with the PROVIDE statement?

52 Views Asked by At

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
0

There are 0 best solutions below