<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/80336>80336</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [lld][ELF] vma gets bumped with MEMORY command / TBSS sections
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
            lld
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          shankarke
      </td>
    </tr>
</table>

<pre>
    The below test when built using lld, bumps the VMA by the size of the tbss section.

`
cat > 1.c << \!
__thread int a = 0;
int b = 10;
int data = 100;
int foo() { return a + b; }
!

cat > script.t << \!
MEMORY {
  MYMEM (rwx) : ORIGIN = 0x1000, LENGTH = 0x80000
}

SECTIONS {
  .foo : { *(.text.foo) } > MYMEM
 .tbss.a : { *(.tbss.a) } > MYMEM
  .bss.b  : { *(.data.b) } > MYMEM
 .data : { *(.data*) } > MYMEM
}
!

CC=clang
CCOPTS="-target riscv32"
LD=ld.lld
$CC $CCOPTS -c 1.c -ffunction-sections -fdata-sections -G0 -fno-asynchronous-unwind-tables
$LD -m elf32lriscv 1.o -T script.t
`

Section dump :-

`
Section Headers:
 [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00 0   0  0
  [ 1] .foo              PROGBITS        00001000 001000 00001e 00  AX  0   0  2
  [ 2] .text             PROGBITS        0000101e 00101e 000000 00  AX  0   0  2
  [ 3] .tbss.a           NOBITS          00001020 001020 000004 00 WAT  0   0  4
  [ 4] .bss.b            PROGBITS 00001024 001024 000004 00  WA  0   0  4
  [ 5] .data             PROGBITS 00001028 001028 000004 00  WA  0   0  4
  [ 6] .comment PROGBITS        00000000 00102c 000038 01  MS  0   0  1
  [ 7] .riscv.attributes RISCV_ATTRIBUTES 00000000 001064 00002b 00      0   0 1
  [ 8] .symtab           SYMTAB          00000000 001090 0000c0 10 10   8  4
  [ 9] .shstrtab         STRTAB          00000000 001150 000056 00      0   0  1
  [10] .strtab           STRTAB          00000000 0011a6 000030 00      0   0  1
`

If you see the VMA address of .bss.b, it is bumped by the size of the .tbss.a section.

This happens only when users use the MEMORY command.

GNU linker layout 

`
Section Headers:
  [Nr] Name              Type            Addr     Off    Size ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .foo              PROGBITS        00001000 001000 00001c 00  AX  0   0  2
  [ 2] .tbss.a           NOBITS 0000101c 00101c 000004 00 WAT  0   0  4
  [ 3] .bss.b            PROGBITS 0000101c 00101c 000004 00  WA  0   0  4
  [ 4] .data PROGBITS        00001020 001020 000004 00  WA  0   0  4
  [ 5] .comment PROGBITS        00000000 001024 000024 01  MS  0   0  1
  [ 6] .riscv.attributes RISCV_ATTRIBUTES 00000000 001048 00002b 00      0   0 1
  [ 7] .symtab           SYMTAB          00000000 001074 000120 10 8  14  4
  [ 8] .strtab           STRTAB          00000000 001194 00002e 00      0   0  1
  [ 9] .shstrtab         STRTAB          00000000 0011c2 000050 00      0   0  1
`
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0l1tzmzgUxz-N_HIGRkhg4wc_-Jp6xpdOoO32qSNAGDYYPEg09X76HQlwsYOTbHaXySB0--no6Jy_YiZEesg5nyBnhpzFgFUyKcqJSFj-xMonPgiK6DzxEw4Bz4pnkFxIeE54DkGVZhIqkeYHyLIIkTkE1fEkQCYcvm6nEJz1p0j_4lDE-lsGQoDgoUyL3ER4gfC0eQ9x_REyCYguwTJDQHSO6ByQM0fEqrt__JBJyVkEaS6BAaILwIjO6k7VFug267oxYpI17dcdcVEg4iIyBjSaQcllVeYKS2YQIDoDNFo09rUGXFspwjI9SVP2mbpdbveP3xW4rgNsv2-XW0DELZ9_6TXpFPaP64f1rt7ILwtjrPy4We4e_E9No4tVa734xRz99pZzf73fed01zLgoNFhtCJEpIq4p-S9p6q2qfS605dqWZpKpjsVkL6bp1nuTwFTdAdzOUr42g7tLNUfxYor-7J1z7wzmc0QXYcbyQ1vff_Y9RBeIEEOy8sAllKkIf1KCCKnHbBaILrLIVPHaMO35HPRbzQYj1JFnxHGV6yg1mmgVYMTKzk79AYMR54XBxDkPk7LIi0oYVf6c5pEhWZBxcVljswDjCDyLKcm0TWCZBRj-JYBusqA533opiKrjSfnM6M2YdtQnziJeCkSbAYCc2a5EzgJ27Mjh6vHPp6uWaRSV-mMfx6rwVM4CLD1YZQfYPME6j2GatUePnBlgRX757L5sNt06bh64LQCrXgDchVoKqkP46vn8uH-YrX2vC7VqjNVCLa6gMP0DWjLpkokmq0x4B1mzmqI19y6Z1uQ6hTqO2He5LZnUNpPGEbYif5v6F7LdJdua3KRZj80N0oZL0SLh27Qf6WikTsLXkC5cijeRQ40Mi-OR57LXobg9KhLqOnUBWwBb7wK0usCRBuo0MZmUZRpUkgt4XHvzrz-mvv-4nn3xl941elhvnwTaVoAWfUV2NVmcj5J1Pep93_rTWW_MWnhcH1WIwdJ_AO6NA8Y1NRGy7HI9__Eu1XJqqjO8MffKXgvX5GvuG2Q2rH2M75BvNGYdw7moQHB-ubdZFJVcCHVn18GnrqRUQir0Bc-jvpu9TYC-y91PUgEJO514LqDIs3P9D0QleCnUWwOa61LFEcujq_kPuy-QpfkTLyFj56KS8M-E8F8r4f-qg90z-s_EMHyPGN6RrEYDQ7gUbyoVfZdS9SHvyor9W6n6d9wnpW_o3vtEqlES-1WRGn5EpGz3HSI1-oBIjbTNFtEK5QJY9s3-3Q8oybhxBH9Noz6kfiGp1e8VjRpEExqN6ZgN-MQa4aFLMMHDQTLBLrbDMbPIcEQCm2PKcWzZsRPZmI5JFAzSCcHExkS5w6ZkaA4jZ8QIDccutmkwHiEb8yNLMzPLfh7NojwMUiEqPnExpcNBxgKeCf1ziBD9u0Zly6CcqNFGUB0EsnGWCil-z5epzPQvKDXeWSBnttyslF9-HhkcuLwI53MqkxulA0RW4M88r5VOMajKbJJIedISRlaIrA6pTKpAxS8iK7VsUxinsviThxKRld6DQGSlt_F3AAAA__-9I2Ll">