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-0001.html>


More information about the devel mailing list