[PATCH v3 1/2] rtld: Enable MTE for stack when specified in .dynamic
Claudiu Zissulescu
claudiu.zissulescu-ianculescu@oracle.com
Thu Mar 12 10:36:36 GMT 2026
>
> This patch should have at least one test checking that the added
> functionality works as intended for each supported mode of stack
> tagging. Ideally, we should check both statically-linked and
> dynamically-linked cases.
A test is provided in the second patch. I can add it to this one.
>
> Some notes below. In a nutshell, I think this experimental functionality
> should be hidden behind a configure flag or at least a tunable.
>
> Note that there already is a configure flag "--enable-memory-tagging"
> which adds -DUSE_MTAG macro and unlock heap tagging in malloc which is
> why it's probably not a good idea to use the same guard for stack
> tagging.
>
> Whatever way to disable stack tagging is chosen, it should somehow
> co-exist with the "--enable-memory-tagging" configure flag and the
> corresponding tunable "glibc.mem.tagging". Both of these two things
> may change soon to make memory tagging in malloc more usable. For this
> reason I would encourage a conversation about how these two things
> (tagging of heap and stack) can be controlled independently.
I am open for suggestions. A tunable may be a solution, let's see others
input on this topic too.
>> +#define ARCH_MTE_MODE_SYNC (1 << 1)
>> +#define ARCH_MTE_MODE_ASYNC (1 << 2)
>
> These two macros seem to be unused. If they are meant for the possible
> values of DT_AARCH64_MEMTAG_MODE, then they would be incorrect because
> possible values are 0 for sync and 1 for async mode.
Noted.
>> +
>> +void
>> +_dl_mte_stack_check (struct link_map *l,
>> + const char *program __attribute__((unused)))
>> +{
>
> Shouldn't there be a check for
>
> GLRO(dl_hwcap2) & HWCAP2_MTE
>
> somewhere (not necessarily here)?
AFAIK, the checking for the MTE capability is done before calling this
function. I'll double check this.
>
>> + ElfW (Dyn) *d;
>> + bool mte_enabled = false;
>> + bool mte_mode_selected = false;
>> +
>> + for (d = l->l_ld; d->d_tag != DT_NULL; ++d)
>> + {
>> + if (d->d_tag == DT_AARCH64_MEMTAG_STACK)
>> + {
>> + GLRO (dl_aarch64_cpu_features).mte_state
>> + |= AARCH64_CPU_FEATURE_MTE_STATE_STACK;
>
> This and...
>
>> + mte_enabled = true;
>> + }
>> + else if (d->d_tag == DT_AARCH64_MEMTAG_MODE)
>> + {
>> + GLRO (dl_aarch64_cpu_features).mte_state
>> + &= ~AARCH64_CPU_FEATURE_MTE_STATE_MODE_MASK;
>
> this conflicts with use of GLRO (dl_aarch64_cpu_features).mte_state for
> heap memory tagging in malloc.
> > I think we should think about combination of these two features: how
> will they co-exist and interact.
The user application can set it's own MTE behavior, sync or
asynchronous. I can understand this may impact other setting. Shall we
remove this feature from user control, or shall we have it as tunable?
Any other suggestions?
>> +
>> + return (err != 0
>> + && (GLRO (dl_aarch64_cpu_features).mte_state
>> + & AARCH64_CPU_FEATURE_MTE_STATE_MODE_MASK) != 0);
>
> Return value is currently unused. What's the model for a failure
> returned from the prctl syscall?
>
Any suggestion is welcome here.
Best wishes,
Claudiu
More information about the Libc-alpha
mailing list