GNU ld supports versioned symbols with static links. We also need to support this for symbol versioning completeness.
Example:
#!/usr/bin/env bash
cat >1.c <<\EOF
__asm__(".symver foo1,foo@V1");
int foo1() {
return 1;
}
__asm__(".symver foo2,foo@V2");
int foo2() {
return 3;
}
__asm__(".symver bar,bar@@@V2");
int bar() {
return 5;
}
EOF
cat >main.c <<\EOF
#include <stdio.h>
__asm__(".symver foo,foo@V2");
int foo();
int bar();
int main() {
int u = foo() + bar();
printf("u: %d\n",u);
return 0;
}
EOF
clang-20 -o 1.o 1.c -c
clang-20 -o main.o main.c -c
LDs=(ld.eld ld.lld ld.bfd)
SFs=(eld lld bfd)
for i in "${!SFs[@]}"; do
clang-20 -o main.${SFs[$i]}.out main.o 1.o --ld-path=$(which ${LDs[$i]})
done
./main.bfd.out prints 8 as expected.
GNU ld supports versioned symbols with static links. We also need to support this for symbol versioning completeness.
Example:
./main.bfd.outprints8as expected.