Changeset b27ae65a in mainline for uspace/lib/c/generic/rtld/module.c


Ignore:
Timestamp:
2025-01-27T12:45:12Z (11 days ago)
Author:
GitHub <noreply@…>
Branches:
master
Children:
97116a2
Parents:
eff458d
git-author:
Matěj Volf <mat.volfik@…> (2025-01-27 12:45:12)
git-committer:
GitHub <noreply@…> (2025-01-27 12:45:12)
Message:

fix calculation of TLS size for main fibril (#240)

  • explain why tcb_t is added at the end of tls allocation
  • fix calculation of TLS size for main fibril

Before this patch, _tcb_data_offset always used progsymbols.elfstart. However,
that is wrong when it is being called from the loader server!! Now we pass to it
a pointer to the correct ELF, falling back to elfstart in the public tls_get call.

(debugging this was quite an ordeal and took me like 5 hours, thanks for asking (':)

  • a few comments for TLS allocation
File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/c/generic/rtld/module.c

    reff458d rb27ae65a  
    398398         * be correct, "zero" offset (i.e. the total size) must be aligned
    399399         * to the strictest alignment present.
    400          * Note that the padding is actually in front of the TLS data,
    401          * not after it.
    402400         */
    403401        rtld->tls_size = ALIGN_UP(rtld->tls_size, rtld->tls_align);
    404402
    405         /* Space for the TCB. */
     403        /*
     404         * Space for the TCB.
     405         * Later, the TLS zero offset is equal to the pointer to tcb_t, so
     406         * adding the sizeof(tcb_t) block AFTER we calculated the alignment
     407         * of the remainder above is correct.
     408         */
    406409        rtld->tls_size += sizeof(tcb_t);
    407410#endif
Note: See TracChangeset for help on using the changeset viewer.