<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/140514>140514</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
dot does not advance as expected in linker script
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
shuffle2
</td>
</tr>
</table>
<pre>
(Apologies for the vague title, there's probably a better description that should be used for someone more familiar with lld internals)
Consider this dummy code and linker script:
```c
int a() { return 1; }
int b() { return 2; }
int c() { return 3; }
const char * d() { return "d"; }
void _start() {
a();
b();
c();
d();
}
```
```
MEMORY {
v : ORIGIN = 0x0000000010000000, LENGTH = 0x80000000
p : ORIGIN = 0x1000000000000000, LENGTH = 0x80000000
}
SECTIONS {
va_pad = CONSTANT(MAXPAGESIZE);
vaddr = ORIGIN(v);
vaddr += va_pad;
paddr = ORIGIN(p);
.a vaddr : AT(paddr) { *(.text.a) } >v
vaddr += va_pad;
paddr += SIZEOF(.a);
.b vaddr : AT(paddr) { *(.text.b); . += va_pad * 3; } >v
/* on gnu ld, can use "." throughout instead of "vaddr", and don't need to explicitly add SIZEOF(.b) to virt addr here */
vaddr += SIZEOF(.b) + va_pad;
paddr += SIZEOF(.b);
.c vaddr : AT(paddr) { *(.text.c) } >v
vaddr += va_pad;
paddr += SIZEOF(.c);
.d vaddr : AT(paddr) { *(.text.d) } >v
}
```
The idea with the linker script is to have VMA and LMA increase alongside each other, however VMA can skip forward sometimes. The above form of the script works on lld and gnu ld. However, the same script also works on ld if `vaddr` is replaced with `.`. This is advantageous as it adheres to customary understanding of how `.` works in the linker script - as you list output sections, the value of dot increases. On lld, this seems to not be the case.
As example, this form of the script would be preferred (partially because code already exists which is written this way), and results in same output as above on gnu ld, but not lld:
```
SECTIONS {
va_pad = CONSTANT(MAXPAGESIZE);
. = ORIGIN(v);
. += va_pad;
paddr = ORIGIN(p);
.a . : AT(paddr) { *(.text.a) } >v
. += va_pad;
paddr += SIZEOF(.a);
.b . : AT(paddr) { *(.text.b); . += va_pad * 3; } >v
/* on gnu ld, can use "." throughout instead of "vaddr", and don't need to explicitly add SIZEOF(.b) to virt addr here */
. += va_pad;
paddr += SIZEOF(.b);
.c . : AT(paddr) { *(.text.c) } >v
. += va_pad;
paddr += SIZEOF(.c);
.d . : AT(paddr) { *(.text.d) } >v
}
```
Testing with e.g.
```
clang --target=riscv64-unknown-elf -o test.elf -nostdlib -ffunction-sections -T test.ld test.c -Wl,--print-map && llvm-readelf-21 -Wa test.elf
```
You will notice that on lld, VMA does not advance as expected.
Desired output (first script):
```
Section Headers:
[Nr] Name Type Address Off Size ES Flg Lk Inf Al
[ 0] NULL 0000000000000000 000000 000000 00 0 0 0
[ 1] .a PROGBITS 0000000010001000 001000 000012 00 AX 0 0 2
[ 2] .b PROGBITS 0000000010002000 002000 003012 00 AX 0 0 2
[ 3] .c PROGBITS 0000000010006012 005012 000012 00 AX 0 0 2
[ 4] .d PROGBITS 0000000010007012 006012 000018 00 AX 0 0 2
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x001000 0x0000000010001000 0x1000000000000000 0x000012 0x000012 R E 0x1000
LOAD 0x002000 0x0000000010002000 0x1000000000000012 0x003012 0x003012 R E 0x1000
LOAD 0x005012 0x0000000010006012 0x1000000000003024 0x000012 0x000012 R E 0x1000
LOAD 0x006012 0x0000000010007012 0x1000000000003036 0x000038 0x000038 R E 0x1000
```
actual output (second script, using `.`):
```
Section Headers:
[Nr] Name Type Address Off Size ES Flg Lk Inf Al
[ 0] NULL 0000000000000000 000000 000000 00 0 0 0
[ 1] .a PROGBITS 0000000010000000 001000 000012 00 AX 0 0 2
[ 2] .b PROGBITS 0000000010000012 001012 003012 00 AX 0 0 2
[ 3] .c PROGBITS 0000000010003024 004024 000012 00 AX 0 0 2
[ 4] .d PROGBITS 0000000010003036 004036 000018 00 AX 0 0 2
Program Headers:
Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
LOAD 0x001000 0x0000000010000000 0x1000000000000000 0x000012 0x000012 R E 0x1000
LOAD 0x001012 0x0000000010000012 0x1000000000000012 0x003012 0x003012 R E 0x1000
LOAD 0x004024 0x0000000010003024 0x1000000000003024 0x000012 0x000012 R E 0x1000
LOAD 0x004036 0x0000000010003036 0x1000000000003036 0x000038 0x000038 R E 0x1000
```
</pre>
<img width="1" height="1" alt="" src="http://email.email.llvm.org/o/eJzcmElv4zoSxz8NcylYkCl5ycEHZesXIEujk3nLXB4osWxxmhYFkrKT9-kHJcqLbL-0u3tmDmMkoCwV_yxWFX-kLJxTiwpxxkZXbHRzIRpfGjtzZTOfa-QXuZHvM8anWW20WSh0MDcWfImwEosGwSuvkfFrumWR8YmD2ppc5PodBOToPVqQ6Aqraq9MBb4UHlxpGi0hR2gcylbSmSWaCmFpLMJcLJVWwsJa-RK0lqAqj7YS2jF-yeKMxdm1qZySSM4oB7JZLt-hMBJBVBK0qr6ihTAsS8iejePwV7A4U5UHwfiU8Utgkyuw6BtbwZAlV8AmN51FfmzB-xbFsUWysyhM5TwUpbDAeAby2JhxLhnfE10ZJeFP54X1O2sWZwCwcZglmxv54Y2id0Pufwvy2yCEGO5_fbx9fP7yx95wK2BJBs9f7j_dPwFLbiB-i7vPsGsp8Q-3T59ef-kMppsHQaI-lth0jc-QCD6_3F6_3j8_vey7Jv6shWw7XD8_vbxmT6-MTx-z3z9nn25f7v9524vKSkhpW-PgCePT1SkDfkU2QXv3sD7uXfd6R2I7QgYZOdJ22WSa8YzxaeTxzUci3LwBltyuvmPw8JAm9nxHYmLnQJSfPXoeekHUH62tzU3V7nvG-B09MhUsqga0pFQVoqI1S4UbMc7Bl9Y0i9I0HlTlPAoJZk5PV8ELTp1oRUpTMT7xUCFK8AbwrdaqUJ44IeXe3MhLMlgp66GdGZElTOTuVMwOujJ-dW4Y834ei7MjWfyH8lj0HZBnOyAPHDi5ul9LBCVRBIoSs3tYBOUozqVYIfz6mLVZenjMQFWFReEQhDbVghgLKIoSDCGe0lmaNa7Qtp2oHtxXVRPD18LKluNeLdFFQOOL3KyQHi6pLsiHbvC1sV8d1RbRnYYONRbBL0G921PAieW2j9DO7HWUoObAxnEotXFME7JYa1GgDHNm4ziif3ilPUI5EHIlKi8WaBoHwoGiEqP6akNRNM6bpbDv0FQSrfOikqpakOelWW_UOg9UdSKkAxJ9Nw1o5TyYxteNB4cFbX1uM6WV0A2SqDR-G20XwXMbjGClHDjEZetWZTxtldS1EA6jkN3MAb6JZb3ZfpU7HeZuo60tztFapOU-rYX1Smj9DjkWgtZz2Dm1RSHfAd-U8w7WpSpKitraKu-xCoOsxTtVbbesLbpG-zYabaa6KQvXZb4Hj7zx7WRolsnh_vPTmI8-Qnz0M3iPfhDt3xr0A6xT7_ysgf9_qP694drDd1ScFatT3P7eUY-Yfc7A5_EanSfctOjCaBHBgU2hRbWAwcALu0DPkhurXLEap4Om-lqZdTVAPYeBAY_OR-11ZZyXWuUwmM-bqsXQYIMjGLwGSy1DW8DgN8349WBQW1X5wVLUwPiY8TFovVoOCA6o5wM-hMFvYjvKgZN_mAbWSmta6arAcOA3W7TRpiENuhYELY4LJFzgW42FR9nR7QadIlh1PGF8OlfW-c2JnlJwBJAwL_iF3LQuGACw0dWTZaMbeCI-9T6v73XvTialRed2N57nc2pe1F9kd_sCd3oBD1_hvppDpjfyEJP88efpHw8P-98PTr4xHDadWfiPt_JDko_EofznL8-fru5fX2D_VD4MSsON7pC3utnvW12-1eWtbr4TOvCTRHgQ6prkQ72k1Ss-1BsHhVFo_tY_kktbOfm30z6hPgl64636dKO-J_7ZmoUVy8M6OSiG5_ncoQeAX5X1VBjwuXx37cXuc6c0vqi_AB5x2bZtgWRaLapW8-E52y8MeoEKmXk7ztnRm1FnRVPZXHyB285wJ08P-bEoPyXaaSW9i1OifZ9HOyf6eezJJzFPz_S5Lz8-lp-ckk_GnVUy3V305PdxIArfCL0HEIeFqeSWINfQOKJtd6oLSDkk7g8y5adA8r_Cxon1E39Ej5Ps-C7xVm4YmvNQ8h3yofziNDQfk-9baOnrUt3FaWj2mbKv-w2uHNNkb9T_Flfin-LKofzRGo2P1-gPEybdsaOfzx8lTBDdEqOfzB_nyoWcJfIyuRQXOBtO0sk4TeJhelHOJKZ8lA7jNB_x5DK-lJO0KNJxwVMpcTIcXagZj_koHg0v4ylPkjSS0wQvcSwkH-YTmSNLY1wKpSM6a0XGLi6Ucw3Ohmk8GqYXWuSoXfszLecVrqF9Skfx0c2FnbUHtLxZOJbG9O7pdjLtT7Qzetf86NxFb3C9d9mLxupZ6X3dVjK9NNwtlC-bPCrMkvE70u-aQW3Nv7DwjN-1XjnG7zq3VzP-7wAAAP__ezrnew">