Hi, Rich, thanks for your feedback. I feel a bit confused about the first comment from you. What's your meaning of "It doesn't make sense to build a glibc-targeting cross compiler then use musl-gcc to try to repurpose it."? I think I'm following the guide from musl user-manual. What's the problem with my operation? I am building a cross-compile with a risc-v gcc and using musl-gcc to create executable for risc-v. I have created static-linked and dynamic-linked by this way and seems it can work and run on qemu-riscv. Following is what gcc tells me when I added "-v" $ $ ./install/bin/musl-gcc -v hello.c ...... /opt/riscv64/libexec/gcc/riscv64-unknown-linux-gnu/10.1.0/collect2 -plugin /opt/riscv64/libexec/gcc/riscv64-unknown-linux-gnu/10.1.0/liblto_plugin.so -plugin-opt=/opt/riscv64/libexec/gcc/riscv64-unknown-linux-gnu/10.1.0/lto-wrapper -plugin-opt=-fresolution=/tmp/ccyYnEJ8.res -plugin-opt=-pass-through=/opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/libgcc.a -plugin-opt=-pass-through=/opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/libgcc_eh.a -plugin-opt=-pass-through=-lc -plugin-opt=-pass-through=/opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/libgcc.a -plugin-opt=-pass-through=/opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/libgcc_eh.a -dynamic-linker /home/u/ws/test-musl-shared/install/ld-musl-riscv64.so.1 -nostdlib /home/u/ws/test-musl-shared/install/lib/Scrt1.o /home/u/ws/test-musl-shared/install/lib/crti.o /opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/crtbeginS.o -L/home/u/ws/test-musl-shared/install/lib -L /opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/. /tmp/cc4bazH8.o /opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/libgcc.a /opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/libgcc_eh.a -lc /opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/libgcc.a /opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/libgcc_eh.a /opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/crtendS.o /home/u/ws/test-musl-shared/install/lib/crtn.o $ ./install/bin/musl-gcc -v -static hello.c ...... /opt/riscv64/libexec/gcc/riscv64-unknown-linux-gnu/10.1.0/collect2 -plugin /opt/riscv64/libexec/gcc/riscv64-unknown-linux-gnu/10.1.0/liblto_plugin.so -plugin-opt=/opt/riscv64/libexec/gcc/riscv64-unknown-linux-gnu/10.1.0/lto-wrapper -plugin-opt=-fresolution=/tmp/ccCghbot.res -plugin-opt=-pass-through=/opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/libgcc.a -plugin-opt=-pass-through=/opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/libgcc_eh.a -plugin-opt=-pass-through=-lc -dynamic-linker /home/u/ws/test-musl-shared/install/ld-musl-riscv64.so.1 -nostdlib -static /home/u/ws/test-musl-shared/install/lib/Scrt1.o /home/u/ws/test-musl-shared/install/lib/crti.o /opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/crtbeginS.o -L/home/u/ws/test-musl-shared/install/lib -L /opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/. /tmp/ccLHqUru.o --start-group /opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/libgcc.a /opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/libgcc_eh.a -lc --end-group /opt/riscv64/lib/gcc/riscv64-unknown-linux-gnu/10.1.0/crtendS.o /home/u/ws/test-musl-shared/install/lib/crtn.o Another question is, how you test and debug musl, expecially the dynamic-linker on cross-arch, i.e, debug on x86 machine but for risc-v? Do you use qemu? I really want to hear your suggestion. Thanks in adv. Best Regards Wang Chen From: Rich Felker Date: 2020-12-08 00:46 To: Chen Wang CC: musl Subject: Re: [musl] [QUESTION] how to gdb dynamic linker for musl? On Mon, Dec 07, 2020 at 09:37:45PM +0800, Chen Wang wrote: > Hello, > I confugure and make musl with following: > > CFLAGS=-g CROSS_COMPILE=riscv64-unknown-linux-gnu- ./configure --prefix=/home/u/ws/musl/install --exec-prefix=/home/u/ws/musl/install --syslibdir=/home/u/ws/musl/install > > create the executable with: ./install/bin/musl-gcc -g test.c I can't say conclusively that you can't make this work, but you really don't want to do it this way. musl-gcc is for repurposing the host gcc on a glibc-based system for "trying out" musl and making minimal programs. It doesn't make sense to build a glibc-targeting cross compiler then use musl-gcc to try to repurpose it. Just build a proper musl-targeting cross-compiler. However this probably isn't your problem. > Then I tried to debug: > $ qemu-riscv64 -g 1234 ./a.out > then launch gdb: > $ riscv64-unknown-linux-gnu-gdb a.out > > but after I tried to target remote, gdb oops and tell me: > ``` > gdb) target remote:1234 > Remote debugging using :1234 > warning: Unable to find dynamic linker breakpoint function. > GDB will be unable to debug shared library initializers > and track explicitly loaded dynamic code. > 0x0000004000850ae2 in ?? () > ``` > > I tried to set sysroot but does NOT take effect: > ``` > (gdb) set sysroot /home/u/ws/musl/install/ > warning: Unable to find dynamic linker breakpoint function. > GDB will be unable to debug shared library initializers > and track explicitly loaded dynamic code. > (gdb) set sysroot /home/u/ws/musl/install/lib > warning: Unable to find dynamic linker breakpoint function. > GDB will be unable to debug shared library initializers > and track explicitly loaded dynamic code. > ``` > I checked the a.out > ``` > $ riscv64-unknown-linux-gnu-readelf -l a.out > ...... > INTERP 0x00000000000001c8 0x00000000000101c8 0x00000000000101c8 > 0x000000000000002d 0x000000000000002d R 0x1 > [Requesting program interpreter: /home/u/ws/musl/install/ld-musl-riscv64.so.1] > ...... > ``` > And I can run with qemu directly: $ qemu-riscv64 ./a.out, this > works, but why I can not debug with gdb? Who can help me out? Thanks > in adv. I haven't used gdb remote with qemu so I'm not sure what to expect here in terms of how it finds/loads the binary and dynamic linker (does it do that over the remote interface or via the local fs?). If you can enable more output from qemu or strace one or both of gdb and qemu it might help figure out what's going on. Hopefully someone else who's use gdb this way can offer more useful help. Rich