Run time linker allocator locking hangs RTEMS
dufault at hda.com
dufault at hda.com
Sat Apr 27 12:23:45 UTC 2019
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 <dufault at 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 at 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 at 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 at gen6 fubar]$ cat foo.c
> #include <stdio.h>
> extern void foo(void);
> void foo(void) {
> puts("FOO\n");
> }
> Zynq dufault at gen6 fubar]$ arm-rtems5-gcc -march=armv7-a -mthumb -c foo.c
> Zynq dufault at gen6 fubar]$ arm-rtems5-strip --strip-unneeded foo.o
> Zynq dufault at 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 at 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 at 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 at 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.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20190427/0fc1d635/attachment-0002.html>
More information about the devel
mailing list