Re: armv7-on-aarch64 stuck at urdlck: I got a replication of the "ampere2" bulk build hangup problem on a Windows DevKit 2023

From: Mark Millard <marklmi_at_yahoo.com>
Date: Mon, 22 Jul 2024 03:58:18 UTC
I found a significant difference in my failing vs. working
armv7 contexts as installed: Presence vs. Lack of a .symtab
entry for the symbol _rtld_get_stack_prot in
/libexec/ld-elf.so.1 .

gdb inspection of operation shows distinctions based on
the difference.

This is related to the code:

(gdb) list  140
135	void
136	_thr_stack_fix_protection(struct pthread *thrd)
137	{
138	
139		mprotect((char *)thrd->attr.stackaddr_attr +
140		    round_up(thrd->attr.guardsize_attr),
141		    round_up(thrd->attr.stacksize_attr),
142		    _rtld_get_stack_prot());
143	}


Working context (Personal build):

NOTE THE .symtab ENTRY BELOW. It allows the gdb run to work:

# readelf -a /libexec/ld-elf.so.1 | grep -E "(^[^ 0-9]|.*_rtld_get_stack_prot)" | less
ELF Header:
Elf file type is DYN (Shared object file)
Entry point 0x14548
There are 10 program headers, starting at offset 52
Program Headers:
There are 24 section headers, starting at offset 0x1f2b8:
Section Headers:
Key to Flags:
Dynamic section at offset 0x199f8 contains 15 entries:
Relocation section (.rel.dyn):
r_offset r_info   r_type              st_value st_name
Symbol table '.dynsym' contains 27 entries:
     5: 000000000001b9ac    16 FUNC    GLOBAL DEFAULT   11 _rtld_get_stack_prot@@FBSDprivate_1.0 (11)
Symbol table '.symtab' contains 911 entries:
   903: 000000000001b9ac    16 FUNC    GLOBAL DEFAULT   11 _rtld_get_stack_prot
Notes at offset 0x00000174 with length 0x00000018:
Histogram for bucket list length (total of 6 buckets):
Histogram for bucket list length (total of 27 buckets):
Version symbol section (.gnu.version):
Version definition section (.gnu.version_d):
Attribute Section: aeabi
File Attributes


Breakpoint 8.3, _thr_stack_fix_protection (thrd=0x2006f000) at /usr/main-src/lib/libthr/thread/thr_stack.c:139
139		mprotect((char *)thrd->attr.stackaddr_attr +
(gdb) si
141		    round_up(thrd->attr.stacksize_attr),
(gdb) 
140		    round_up(thrd->attr.guardsize_attr),
(gdb) 
round_up (size=4096) at /usr/main-src/lib/libthr/thread/thr_stack.c:129
129		if (size % _thr_page_size != 0)
(gdb) 
0x201110b8	129		if (size % _thr_page_size != 0)
130			size = ((size / _thr_page_size) + 1) *
(gdb) 
0x201110c0	130			size = ((size / _thr_page_size) + 1) *
(gdb) 
0x201110c4 in round_up (size=4096) at /usr/main-src/lib/libthr/thread/thr_stack.c:130
130			size = ((size / _thr_page_size) + 1) *
(gdb) 
0x201110c8	130			size = ((size / _thr_page_size) + 1) *
(gdb) 
round_up (size=67108864) at /usr/main-src/lib/libthr/thread/thr_stack.c:129
129		if (size % _thr_page_size != 0)
(gdb) 
0x201110d0 in round_up (size=4096) at /usr/main-src/lib/libthr/thread/thr_stack.c:129
129		if (size % _thr_page_size != 0)
(gdb) 
0x201110d4 in round_up (size=67108864) at /usr/main-src/lib/libthr/thread/thr_stack.c:129
129		if (size % _thr_page_size != 0)
(gdb) 
0x201110d8	129		if (size % _thr_page_size != 0)
(gdb) 
0x201110dc in round_up (size=4096) at /usr/main-src/lib/libthr/thread/thr_stack.c:129
129		if (size % _thr_page_size != 0)
(gdb) 
0x201110e0	129		if (size % _thr_page_size != 0)
(gdb) 
_thr_stack_fix_protection (thrd=0x2006f000) at /usr/main-src/lib/libthr/thread/thr_stack.c:139
139		mprotect((char *)thrd->attr.stackaddr_attr +
(gdb) 
142		    _rtld_get_stack_prot());
(gdb) 
0x20114880 in ?? () from /lib/libthr.so.3
(gdb) 
0x20114884 in ?? () from /lib/libthr.so.3
(gdb) 
0x20114888 in ?? () from /lib/libthr.so.3
(gdb) 

Breakpoint 9.1, _rtld_get_stack_prot () at /usr/main-src/libexec/rtld-elf/rtld.c:5884
5884		return (stack_prot);
(gdb) 
0x2005b9b0	5884		return (stack_prot);
(gdb) 
0x2005b9b4	5884		return (stack_prot);



Failing context (Official PkgBase build):

NOTE THE *LACK OF* THE .symtab ENTRY ABOVE. _rtld_bind_start ends
up in use instead, which looks to lead to the gdb run not working.

IN FACT, NOTE THE LACK OF ANY "Symbol table '.symtab' contains"
TEXT AT ALL!

# readelf -a /libexec/ld-elf.so.1 | grep -E "(^[^ 0-9]|.*_rtld_get_stack_prot)" | less
ELF Header:
Elf file type is DYN (Shared object file)
Entry point 0x147b0
There are 10 program headers, starting at offset 52
Program Headers:
There are 22 section headers, starting at offset 0x1a960:
Section Headers:
Key to Flags:
Dynamic section at offset 0x1a4cc contains 15 entries:
Relocation section (.rel.dyn):
r_offset r_info   r_type              st_value st_name
Symbol table '.dynsym' contains 27 entries:
     5: 000000000001bcd8    16 FUNC    GLOBAL DEFAULT   11 _rtld_get_stack_prot@@FBSDprivate_1.0 (11)
Notes at offset 0x00000174 with length 0x00000018:
Histogram for bucket list length (total of 6 buckets):
Histogram for bucket list length (total of 27 buckets):
Version symbol section (.gnu.version):
Version definition section (.gnu.version_d):
Attribute Section: aeabi
File Attributes


Breakpoint 2.3, _thr_stack_fix_protection (thrd=0x20070000) at /home/pkgbuild/worktrees/main/lib/libthr/thread/thr_stack.c:140
140		    round_up(thrd->attr.guardsize_attr),
(gdb) si
139		mprotect((char *)thrd->attr.stackaddr_attr +
(gdb) 
141		    round_up(thrd->attr.stacksize_attr),
(gdb) 
round_up (size=4096) at /home/pkgbuild/worktrees/main/lib/libthr/thread/thr_stack.c:129
129		if (size % _thr_page_size != 0)
(gdb) 
130			size = ((size / _thr_page_size) + 1) *
(gdb) 
129		if (size % _thr_page_size != 0)
(gdb) 
130			size = ((size / _thr_page_size) + 1) *
(gdb) 
0x20112ef8	130			size = ((size / _thr_page_size) + 1) *
(gdb) 
0x20116b60 in ?? () from /lib/libthr.so.3
(gdb) 
0x20116b64 in ?? () from /lib/libthr.so.3
(gdb) 
0x20116b68 in ?? () from /lib/libthr.so.3
(gdb) 
0x20116760 in ?? () from /lib/libthr.so.3
(gdb) 
0x20116764 in ?? () from /lib/libthr.so.3
(gdb) 
0x20116768 in ?? () from /lib/libthr.so.3
(gdb) 
0x2011676c in ?? () from /lib/libthr.so.3
(gdb) 
_rtld_bind_start () at /home/pkgbuild/worktrees/main/libexec/rtld-elf/arm/rtld_start.S:78
78		stmdb	sp!,{r0-r5,sl,fp}
(gdb) si
80		sub	r1, ip, lr		/* r1 = 4 * (n + 1) */
(gdb) 
81		sub	r1, r1, #4		/* r1 = 4 * n */
(gdb) 
82		add	r1, r1, r1		/* r1 = 8 * n */
(gdb) 
84		ldr	r0, [lr, #-4]		/* get obj ptr from GOT[1] */
(gdb) 
85		mov	r4, ip			/* save GOT location */
(gdb) 
87		mov	r5, sp			/* Save the stack pointer */
(gdb) 
88		bic	sp, sp, #7		/* Align the stack pointer */
(gdb) 
_rtld_bind_start () at /home/pkgbuild/worktrees/main/libexec/rtld-elf/arm/rtld_start.S:89
89		bl	_rtld_bind		/* Call the binder */


I have not checked for other .symtab entry problems.

Nor have I figured out why the installed materials are
different for Symbol table '.symtab' . So this is not
yet root-cause information.

===
Mark Millard
marklmi at yahoo.com