This is an archive of the discontinued LLVM Phabricator instance.

[llvm-objcopy] Skip --localize-symbol for undefined symbols
ClosedPublic

Authored by rupprecht on Jan 29 2019, 2:20 PM.

Details

Summary

Include the symbol being defined in the list of requirements for using --localize-symbol.

This is used, for example, when someone is depending on two different projects that have the same (or close enough) method defined in each library, and using "-L sym" for a conflicting symbol in one of the libraries so that the definition from the other one is used. However, the library may have internal references to the symbol, which cause program crashes when those are used, i.e.:

$ cat foo.c
int foo() { return 5; }
$ cat bar.c
int foo();
int bar() { return 2 * foo(); }
$ cat foo2.c
int foo() { /* Safer implementation */ return 42; }
$ cat main.c
int bar();
int main() {
  __builtin_printf("bar = %d\n", bar());
  return 0;
}
$ ar rcs libfoo.a foo.o bar.o
$ ar rcs libfoo2.a foo2.o
# Picks the wrong foo() impl
$ clang main.o -lfoo -lfoo2 -L. -o main
# Picks the right foo() impl
$ objcopy -L foo libfoo.a && clang main.o -lfoo -lfoo2 -L. -o main
# Links somehow, but crashes at runtime
$ llvm-objcopy -L foo libfoo.a && clang main.o -lfoo -lfoo2 -L. -o main

Diff Detail

Repository
rL LLVM

Event Timeline

rupprecht created this revision.Jan 29 2019, 2:20 PM
rupprecht set the repository for this revision to rL LLVM.Jan 29 2019, 2:27 PM
jhenderson accepted this revision.Jan 31 2019, 3:36 AM

To clarify, does objcopy do exactly the same thing (i.e. doesn't localize the undefined global symbol)?

I was trying to figure out if there was any information on what is supposed to happen with these, but I couldn't find any. I suspect it's simply undefined behaviour (e.g. it could just not patch the reference or it could error out).

This revision is now accepted and ready to land.Jan 31 2019, 3:36 AM

To clarify, does objcopy do exactly the same thing (i.e. doesn't localize the undefined global symbol)?

Yep -- that's the difference in the repro from the patch description. I'll add a small comment to the source before committing.

I was trying to figure out if there was any information on what is supposed to happen with these, but I couldn't find any. I suspect it's simply undefined behaviour (e.g. it could just not patch the reference or it could error out).

In general (i.e. this patch is just one tiny instance), I've found it very difficult to find sources on what "should" happen with things. The ELF spec will satisfy the questions of what fields exist and what values they can have, but don't give much besides a simple example of what the field is, and hardly say anything about combinations of things being set (i.e. in this instance, is SHN_UNDEF + STB_LOCAL even a valid combination).

This revision was automatically updated to reflect the committed changes.