]> granicus.if.org Git - llvm/commit
[llvm-objcopy] Skip --localize-symbol for undefined symbols
authorJordan Rupprecht <rupprecht@google.com>
Thu, 31 Jan 2019 16:45:16 +0000 (16:45 +0000)
committerJordan Rupprecht <rupprecht@google.com>
Thu, 31 Jan 2019 16:45:16 +0000 (16:45 +0000)
commit4c8e4dc9fda0b4f7abecb0d77b5dc17fbcce4233
tree9203305325bee2942c82b7c06d0f06b9588fbf98
parent2540582e98a2a681ba3ff5b59f6b75c23d89947f
[llvm-objcopy] Skip --localize-symbol for undefined symbols

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
```

Reviewers: jhenderson, alexshap, jakehehrlich, espindola

Subscribers: emaste, arichardson

Differential Revision: https://reviews.llvm.org/D57417

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@352767 91177308-0d34-0410-b5e6-96231b3b80d8
test/tools/llvm-objcopy/ELF/localize.test
tools/llvm-objcopy/ELF/ELFObjcopy.cpp