This is because RTL locks out heap operations. For ELF files rtems_rtl_alloc_lock() calls rtem_rtl_alloc_heap() and that calls _RTEMS_Lock_allocator() which locks the heap. Then RTL calls read() and the NFS threads try to use the heap.
(gdb) up #1 0x00135394 in rtems_rtl_alloc_lock () at /home/dufault/development/rtems/kernel/rtems/c/src/../../cpukit/libdl/rtl-allocator.c:119 119 rtl->allocator.allocator (RTEMS_RTL_ALLOC_LOCK, (gdb) print rtl->allocator.allocator $469 = (rtems_rtl_allocator) 0x1357c5 <rtems_rtl_alloc_heap> (gdb) > On Apr 26, 2019, at 17:35 , Peter Dufault <dufa...@hda.com> wrote: > > I found this trying to work on "#3740: Libld does not load incrementially > linked object file”. When I updated it hung loading the text segment (line > 1005 in rtl-elf.c, hard hang, debug output below). I tracked it down to a > change that adds locking to the allocator. > > - BSP: xilinx_zynq_a9_qemu. Followed instructions in rtems-libbsd README.md. > - rtems version: works in bdec62c, broken in 22afb03. > - rtems-libbsd: You need to go back to before renaming of some SMP symbols, I > went back to 5432c6b. > > **** This is the change that broke it: > [dufault@gen6 rtems]$ git log --pretty=format:"%h %ad %s" bdec62c...22afb03 > 22afb03 Mon Feb 18 11:46:22 2019 +1100 libdl/alloc: Add a locking interface > to the allocator. > [dufault@gen6 rtems]$ > > **** Loading works in bdec62c: > -> ld 0,0,"foo.o" > value = 4070648 = 0x3e1cf8 > -> foo() > FOO > value = 10 = 0xa > -> > > **** Loading hangs in 22afb03: > -> ld 0,0,”foo.o” > **** HANG > > **** GDB output during hang and info on (extremely simple) downloaded object. > > In GDB attached to qemu you see the hang loading the text segment at line > 1005 of rtl-elf.c: > > (gdb) target remote :1234 > Remote debugging using :1234 > bsp_start_vector_table_end () > at > /home/dufault/development/rtems/kernel/rtems/c/src/lib/libbsp/arm/xilinx-zynq/../../../../../../bsps/arm/shared/start/start.S:146 > 146 mov r5, r1 /* machine type number or ~0 for DT > boot */ > (gdb) b rtl-elf.c:1005 > Breakpoint 1 at 0x13a0a6: file > /home/dufault/development/rtems/kernel/rtems/c/src/../../cpukit/libdl/rtl-elf.c, > line 1005. > (gdb) c > Continuing. > > Breakpoint 1, rtems_rtl_elf_loader (obj=0x3e1cf8, fd=43, sect=0x3e1eb8, > data=0x2928a8) > at > /home/dufault/development/rtems/kernel/rtems/c/src/../../cpukit/libdl/rtl-elf.c:1005 > 1005 ssize_t r = read (fd, base_offset, len); > (gdb) next > ^C *** HANG HERE *** > Program received signal SIGINT, Interrupt. > 0x0015bd4a in _CPU_Thread_Idle_body (ignored=0) > at > /home/dufault/development/rtems/kernel/rtems/c/src/../../cpukit/score/cpu/arm/armv7-thread-idle.c:32 > 32 __asm__ volatile ("wfi"); > (gdb) > > **** Info on downloaded object. It’s just a simple “.o” file with extra > symbols stripped. > > Zynq dufault@gen6 fubar]$ cat foo.c > #include <stdio.h> > extern void foo(void); > void foo(void) { > puts("FOO\n"); > } > Zynq dufault@gen6 fubar]$ arm-rtems5-gcc -march=armv7-a -mthumb -c foo.c > Zynq dufault@gen6 fubar]$ arm-rtems5-strip --strip-unneeded foo.o > Zynq dufault@gen6 fubar]$ arm-rtems5-readelf --all foo.o > ELF Header: > Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 > Class: ELF32 > Data: 2's complement, little endian > Version: 1 (current) > OS/ABI: UNIX - System V > ABI Version: 0 > Type: REL (Relocatable file) > Machine: ARM > Version: 0x1 > Entry point address: 0x0 > Start of program headers: 0 (bytes into file) > Start of section headers: 552 (bytes into file) > Flags: 0x5000000, Version5 EABI > Size of this header: 52 (bytes) > Size of program headers: 0 (bytes) > Number of program headers: 0 > Size of section headers: 40 (bytes) > Number of section headers: 11 > Section header string table index: 10 > > Section Headers: > [Nr] Name Type Addr Off Size ES Flg Lk Inf > Al > [ 0] NULL 00000000 000000 000000 00 0 0 > 0 > [ 1] .text PROGBITS 00000000 000034 000014 00 AX 0 0 > 2 > [ 2] .rel.text REL 00000000 0001bc 000018 08 I 8 1 > 4 > [ 3] .data PROGBITS 00000000 000048 000000 00 WA 0 0 > 1 > [ 4] .bss NOBITS 00000000 000048 000000 00 WA 0 0 > 1 > [ 5] .rodata PROGBITS 00000000 000048 000005 00 A 0 0 > 4 > [ 6] .comment PROGBITS 00000000 00004d 000065 01 MS 0 0 > 1 > [ 7] .ARM.attributes ARM_ATTRIBUTES 00000000 0000b2 00002f 00 0 0 > 1 > [ 8] .symtab SYMTAB 00000000 0000e4 0000c0 10 9 10 > 4 > [ 9] .strtab STRTAB 00000000 0001a4 000015 00 0 0 > 1 > [10] .shstrtab STRTAB 00000000 0001d4 000051 00 0 0 > 1 > Key to Flags: > W (write), A (alloc), X (execute), M (merge), S (strings), I (info), > L (link order), O (extra OS processing required), G (group), T (TLS), > C (compressed), x (unknown), o (OS specific), E (exclude), > y (purecode), p (processor specific) > > There are no section groups in this file. > > There are no program headers in this file. > > There is no dynamic section in this file. > > Relocation section '.rel.text' at offset 0x1bc contains 3 entries: > Offset Info Type Sym.Value Sym. Name > 00000004 0000022f R_ARM_THM_MOVW_AB 00000000 .LC0 > 00000008 00000230 R_ARM_THM_MOVT_AB 00000000 .LC0 > 0000000c 00000b0a R_ARM_THM_CALL 00000000 puts > > There are no unwind sections in this file. > > Symbol table '.symtab' contains 12 entries: > Num: Value Size Type Bind Vis Ndx Name > 0: 00000000 0 NOTYPE LOCAL DEFAULT UND > 1: 00000000 0 NOTYPE LOCAL DEFAULT 5 $d > 2: 00000000 0 NOTYPE LOCAL DEFAULT 5 .LC0 > 3: 00000000 0 NOTYPE LOCAL DEFAULT 1 $t > 4: 00000000 0 SECTION LOCAL DEFAULT 1 > 5: 00000000 0 SECTION LOCAL DEFAULT 3 > 6: 00000000 0 SECTION LOCAL DEFAULT 4 > 7: 00000000 0 SECTION LOCAL DEFAULT 5 > 8: 00000000 0 SECTION LOCAL DEFAULT 6 > 9: 00000000 0 SECTION LOCAL DEFAULT 7 > 10: 00000001 20 FUNC GLOBAL DEFAULT 1 foo > 11: 00000000 0 NOTYPE GLOBAL DEFAULT UND puts > > No version information found in this file. > Attribute Section: aeabi > File Attributes > Tag_CPU_name: "7-A" > Tag_CPU_arch: v7 > Tag_CPU_arch_profile: Application > Tag_ARM_ISA_use: Yes > Tag_THUMB_ISA_use: Thumb-2 > Tag_ABI_PCS_wchar_t: 4 > Tag_ABI_FP_denormal: Needed > Tag_ABI_FP_exceptions: Needed > Tag_ABI_FP_number_model: IEEE 754 > Tag_ABI_align_needed: 8-byte > Tag_ABI_align_preserved: 8-byte, except leaf SP > Tag_ABI_enum_size: int > Tag_ABI_optimization_goals: Aggressive Debug > Tag_CPU_unaligned_access: v6 > > **** Disassembly > > Zynq dufault@gen6 fubar]$ arm-rtems5-objdump --disassemble --source foo.o > > foo.o: file format elf32-littlearm > > > Disassembly of section .text: > > 00000000 <foo>: > 0: b580 push {r7, lr} > 2: af00 add r7, sp, #0 > 4: f240 0000 movw r0, #0 > 8: f2c0 0000 movt r0, #0 > c: f7ff fffe bl 0 <puts> > 10: bf00 nop > 12: bd80 pop {r7, pc} > Zynq dufault@gen6 fubar]$ > > Peter > ----------------- > Peter Dufault > HD Associates, Inc. Software and System Engineering > > This email is delivered through the public internet using protocols subject > to interception and tampering. > > _______________________________________________ > devel mailing list > devel@rtems.org > http://lists.rtems.org/mailman/listinfo/devel Peter ----------------- Peter Dufault HD Associates, Inc. Software and System Engineering This email is delivered through the public internet using protocols subject to interception and tampering.
_______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel