* [BUG] Force to use a dynamic linker in musl-clang wapper cause a crash for static-pie c++ programs. @ 2019-12-24 14:38 Youren Shen 2019-12-24 15:03 ` Rich Felker 0 siblings, 1 reply; 4+ messages in thread From: Youren Shen @ 2019-12-24 14:38 UTC (permalink / raw) To: musl [-- Attachment #1: Type: text/plain, Size: 900 bytes --] Hey, there, Recently I'm trying to build a non-gnu toolchain with musl, clang, llvm, libc++, compiler-rt. While static-pie feature is very useful in our project, musl-clang force to link a dynamic linker into the binary. This behavior will cause a crash in c++ programs with compiler-rt and libc++. For more details and reproduction of this bug, you can read my previous email to llvm-dev mail lists.[1] I spend a few days to find the reason -- in function _dlstart_c, the program will get a "base" of relocation in /lib/ld-musl-x86_64.so.1, which is not right when it tries to relocate .rel.dyn section in the binary. Overall, the static-pie program does not need a dynamic linker at all. So maybe we should remove this argument in wrapper when static-pie is enabled. Thank you very much. [1]. https://groups.google.com/forum/#!msg/llvm-dev/XPrSPqD2zjM/YtH6Fi2YAgAJ -- Best Regards. Youren Shen. [-- Attachment #2: Type: text/html, Size: 1213 bytes --] ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [BUG] Force to use a dynamic linker in musl-clang wapper cause a crash for static-pie c++ programs. 2019-12-24 14:38 [BUG] Force to use a dynamic linker in musl-clang wapper cause a crash for static-pie c++ programs Youren Shen @ 2019-12-24 15:03 ` Rich Felker 2019-12-25 10:37 ` Youren Shen 0 siblings, 1 reply; 4+ messages in thread From: Rich Felker @ 2019-12-24 15:03 UTC (permalink / raw) To: Youren Shen; +Cc: musl On Tue, Dec 24, 2019 at 10:38:49PM +0800, Youren Shen wrote: > Hey, there, > Recently I'm trying to build a non-gnu toolchain with musl, clang, llvm, > libc++, compiler-rt. While static-pie feature is very useful in our > project, musl-clang force to link a dynamic linker into the binary. This > behavior will cause a crash in c++ programs with compiler-rt and libc++. > For more details and reproduction of this bug, you can read my previous > email to llvm-dev mail lists.[1] > I spend a few days to find the reason -- in function _dlstart_c, the > program will get a "base" of relocation in /lib/ld-musl-x86_64.so.1, which > is not right when it tries to relocate .rel.dyn section in the binary. > Overall, the static-pie program does not need a dynamic linker at all. So > maybe we should remove this argument in wrapper when static-pie is enabled. > > Thank you very much. > > [1]. https://groups.google.com/forum/#!msg/llvm-dev/XPrSPqD2zjM/YtH6Fi2YAgAJ I don't think the wrappers (gcc or clang one) have been updated with logic for static pie since it was added, and I'm not sure how easy it is to add. I'd welcome patches for review, though. Rich ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [BUG] Force to use a dynamic linker in musl-clang wapper cause a crash for static-pie c++ programs. 2019-12-24 15:03 ` Rich Felker @ 2019-12-25 10:37 ` Youren Shen 2019-12-26 4:46 ` Fangrui Song 0 siblings, 1 reply; 4+ messages in thread From: Youren Shen @ 2019-12-25 10:37 UTC (permalink / raw) To: Rich Felker; +Cc: musl [-- Attachment #1.1: Type: text/plain, Size: 2453 bytes --] Thanks for your reply. Dived deeper, I think this is because the options clang/gcc passed to ld are not well handled by ld. Unlike "-static", which is passed directly to the linker, the clang pass -no-dynamic-linker when static-pie is enabled. However, -dynamic-linker=<file> in ld.musl-clang wrapper conflict with this -no-dynamic-linker. As a result, ld accepts the last one it received, which is "-dynamic-linker=<file>" in this case. Here is the problem: even we passed static-pie to clang, and then the clang pass -no-dynamic-linker to ld, This option is still omitted by ld.musl-clang. I suggest a fix on it: move -dynamic-linker "$ldso" before the previous user inputs. Before: ``` exec $($cc -print-prog-name=ld) -nostdlib "$@" -lc -dynamic-linker "$ldso" ``` After: ``` exec $($cc -print-prog-name=ld) -nostdlib -dynamic-linker "$ldso" "$@" -lc ``` As you can see, this is a quite simple patch. Further testes may required. And for musl-gcc, as I test, it seems that it has the same problem. But I'm not familiar with gcc specs file. So maybe if anyone encounter the same problem, they can refer this email and give a solution. On Tue, Dec 24, 2019 at 11:03 PM Rich Felker <dalias@libc.org> wrote: > On Tue, Dec 24, 2019 at 10:38:49PM +0800, Youren Shen wrote: > > Hey, there, > > Recently I'm trying to build a non-gnu toolchain with musl, clang, llvm, > > libc++, compiler-rt. While static-pie feature is very useful in our > > project, musl-clang force to link a dynamic linker into the binary. This > > behavior will cause a crash in c++ programs with compiler-rt and libc++. > > For more details and reproduction of this bug, you can read my previous > > email to llvm-dev mail lists.[1] > > I spend a few days to find the reason -- in function _dlstart_c, the > > program will get a "base" of relocation in /lib/ld-musl-x86_64.so.1, > which > > is not right when it tries to relocate .rel.dyn section in the binary. > > Overall, the static-pie program does not need a dynamic linker at all. So > > maybe we should remove this argument in wrapper when static-pie is > enabled. > > > > Thank you very much. > > > > [1]. > https://groups.google.com/forum/#!msg/llvm-dev/XPrSPqD2zjM/YtH6Fi2YAgAJ > > I don't think the wrappers (gcc or clang one) have been updated with > logic for static pie since it was added, and I'm not sure how easy it > is to add. I'd welcome patches for review, though. > > Rich > -- Best Regards. Youren Shen. [-- Attachment #1.2: Type: text/html, Size: 3303 bytes --] [-- Attachment #2: static-pie-for-ld.musl-clang.patch --] [-- Type: application/octet-stream, Size: 346 bytes --] diff --git a/tools/ld.musl-clang.in b/tools/ld.musl-clang.in index 93763d6..7cb49d9 100644 --- a/tools/ld.musl-clang.in +++ b/tools/ld.musl-clang.in @@ -48,4 +48,4 @@ for x ; do esac done -exec $($cc -print-prog-name=ld) -nostdlib "$@" -lc -dynamic-linker "$ldso" +exec $($cc -print-prog-name=ld) -nostdlib -dynamic-linker "$ldso" "$@" -lc ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [BUG] Force to use a dynamic linker in musl-clang wapper cause a crash for static-pie c++ programs. 2019-12-25 10:37 ` Youren Shen @ 2019-12-26 4:46 ` Fangrui Song 0 siblings, 0 replies; 4+ messages in thread From: Fangrui Song @ 2019-12-26 4:46 UTC (permalink / raw) To: Youren Shen; +Cc: Rich Felker, musl >On Tue, Dec 24, 2019 at 11:03 PM Rich Felker <dalias@libc.org> wrote: > > On Tue, Dec 24, 2019 at 10:38:49PM +0800, Youren Shen wrote: > > Hey, there, > > Recently I'm trying to build a non-gnu toolchain with musl, clang, llvm, > > libc++, compiler-rt. While static-pie feature is very useful in our > > project, musl-clang force to link a dynamic linker into the binary. This > > behavior will cause a crash in c++ programs with compiler-rt and libc++. > > For more details and reproduction of this bug, you can read my previous > > email to llvm-dev mail lists.[1] > > I spend a few days to find the reason -- in function _dlstart_c, the > > program will get a "base" of relocation in /lib/ld-musl-x86_64.so.1, > which > > is not right when it tries to relocate .rel.dyn section in the binary. > > Overall, the static-pie program does not need a dynamic linker at all. So > > maybe we should remove this argument in wrapper when static-pie is > enabled. > > > > Thank you very much. > > > > [1]. https://groups.google.com/forum/#!msg/llvm-dev/XPrSPqD2zjM/ > YtH6Fi2YAgAJ > > I don't think the wrappers (gcc or clang one) have been updated with > logic for static pie since it was added, and I'm not sure how easy it > is to add. I'd welcome patches for review, though. > > Rich > > Thanks for your reply. > > Dived deeper, I think this is because the options clang/gcc passed to ld are > not well handled by ld. Unlike "-static", which is passed directly to the > linker, the clang pass -no-dynamic-linker when static-pie is enabled. However, > -dynamic-linker=<file> in ld.musl-clang wrapper conflict with this > -no-dynamic-linker. As a result, ld accepts the last one it received, which is > "-dynamic-linker=<file>" in this case. Here is the problem: even we passed > static-pie to clang, and then the clang pass -no-dynamic-linker to ld, This > option is still omitted by ld.musl-clang. I suggest a fix on it: move > -dynamic-linker "$ldso" before the previous user inputs. > Before: > ``` > exec $($cc -print-prog-name=ld) -nostdlib "$@" -lc -dynamic-linker "$ldso" > ``` > After: > ``` > exec $($cc -print-prog-name=ld) -nostdlib -dynamic-linker "$ldso" "$@" -lc > ``` > As you can see, this is a quite simple patch. Further testes may required. And > for musl-gcc, as I test, it seems that it has the same problem. But I'm not > familiar with gcc specs file. So maybe if anyone encounter the same problem, > they can refer this email and give a solution. It may be better moving -dynamic-linker from ld.musl-clang to musl-clang. For -shared, -static, and -static-pie, gcc specs does not pass -dynamic-linker. musl-clang should not pass -dynamic-linker if one of -shared, -static, -static-pie is used. (I think the ideal solution is not to have any platform-dependent default ld.so path (if GNU ld had done this, there would have been no point to have --no-dynamic-linker in the first place). Let -dynamic-linker create .interp . See https://reviews.llvm.org/D62765) [-Wunused-command-line-argument] is another issue: % ~/musl/Debug/obj/musl-clang a.c -c clang: warning: argument unused during compilation: '-fuse-ld=musl-clang' [-Wunused-command-line-argument] clang: warning: argument unused during compilation: '-static-libgcc' [-Wunused-command-line-argument] clang: warning: argument unused during compilation: '-L-user-start' [-Wunused-command-line-argument] clang: warning: argument unused during compilation: '-L/home/ray/.local/stow/musl/lib' [-Wunused-command-line-argument] clang: warning: argument unused during compilation: '-L-user-end' [-Wunused-command-line-argument] Adding a default -Wno-unused-command-line-argument may be a solution. ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2019-12-26 4:46 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2019-12-24 14:38 [BUG] Force to use a dynamic linker in musl-clang wapper cause a crash for static-pie c++ programs Youren Shen 2019-12-24 15:03 ` Rich Felker 2019-12-25 10:37 ` Youren Shen 2019-12-26 4:46 ` Fangrui Song
Code repositories for project(s) associated with this public inbox https://git.vuxu.org/mirror/musl/ This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).