[PATCH] D30812: AsmPrinter: Don't treat symbols with prefix data as code
Moritz Angermann via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Mar 10 21:14:24 PST 2017
angerman planned changes to this revision.
angerman added a comment.
In https://reviews.llvm.org/D30812#698479, @pcc wrote:
> Does this really solve your problem? The linker should only create the trampoline if an object that takes a reference to the function with prefix data was built without `-fPIC`. If you change the symbol type to object I would expect the linker to create a copy relocation instead. That would cause the dynamic loader to create a copy of the function body in the main executable's address space, and that copy would not be in executable memory so you would not be able to call it.
>
> In fact, if I patch in your change and compile your test case, that is exactly what happens:
>
> $ readelf -r main
>
> Relocation section '.rela.dyn' at offset 0x508 contains 2 entries:
> Offset Info Type Sym. Value Sym. Name + Addend
> 000000600ff8 000400000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0
> 000000601040 000c00000005 R_X86_64_COPY 0000000000601040 hello + 0
>
> Relocation section '.rela.plt' at offset 0x538 contains 3 entries:
> Offset Info Type Sym. Value Sym. Name + Addend
> 000000601018 000200000007 R_X86_64_JUMP_SLO 0000000000000000 printf + 0
> 000000601020 000300000007 R_X86_64_JUMP_SLO 0000000000000000 __libc_start_main + 0
> 000000601028 000400000007 R_X86_64_JUMP_SLO 0000000000000000 __gmon_start__ + 0
>
>
> and if I change your test case like this:
>
> diff --git a/main.c b/main.c
> index d54d1c5..accf187 100644
> --- a/main.c
> +++ b/main.c
> @@ -5,5 +5,6 @@ int hello(void);
> int main() {
> int *prefix_data = (int*) &hello;
> printf("hi: %d\n", prefix_data[-1]);
> + hello();
> return 0;
> }
>
>
> I get:
>
> $ LD_LIBRARY_PATH=. ./main
> hi: 0
> Segmentation fault (core dumped)
>
>
> I think the correct fix is for you to arrange to build any objects that may access prefix data with `-fPIC` (or with the `-relocation-model=pic` flag to `llc`). If I change your test case to do that:
>
> diff --git a/Makefile b/Makefile
> index 84ccf76..9d22147 100644
> --- a/Makefile
> +++ b/Makefile
> @@ -6,7 +6,7 @@ all : libtest.s main
> libtest.so : libtest.o
> gcc -shared -o $@ $+
>
> -main : main.o libtest.so
> +main : main.c libtest.so
> gcc -fPIC -L. -ltest -o $@ $+
>
> run : main
>
>
> the `main` binary works as intended.
Thank you @pcc for the thorough review and the lengthy test and explanation. This
now ends up being a bit more puzzling that with what we started. Especially as to
why the `function` to `object` rewrite we did, seemingly used to work. This should
not have worked, as you have demonstrated.
Our test case clearly fell prey to the implicit `%.o : %c` rule that make provides, and
which does not come with `-fPIC`.
I'll try to locate the issue we saw again and see where it deviates from the fixed test
case based on your suggestions to see if we still have a genuine issue or if there is/was
a bug in our toolchain use.
Thank you.
https://reviews.llvm.org/D30812
More information about the llvm-commits
mailing list