This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
-ftls-model docs/implementation inconsistency
- From: Alexander Monakov <amonakov at ispras dot ru>
- To: gcc at gcc dot gnu dot org
- Date: Fri, 19 Jul 2013 19:34:30 +0400 (MSK)
- Subject: -ftls-model docs/implementation inconsistency
Hello,
Suppose a user builds a non-PIC shared object for x86 target with gcc by
passing -shared but not -fPIC. This works, but internally GCC will not set
flag_shlib (as flag_shlib == flag_pic && !flag_pie).
Suppose further the user loads that shared object at runtime with dlopen. For
that to work reliably, any TLS data there must be allocated with local-dynamic
or global-dynamic model. However, since flag_shlib was not set,
varasm.c:decl_default_tls_model will choose local-exec or initial-exec.
The documentation for -ftls-model option promises that the user can override
the choice from command line:
-ftls-model=model
Alter the thread-local storage model to be used. The model argument should
be one of "global-dynamic", "local-dynamic", "initial-exec" or "local-exec".
However the implementation does not allow arbitrary overriding:
decl_default_tls_model (const_tree decl)
{
if (!flag_shlib)
kind = is_local ? TLS_MODEL_LOCAL_EXEC : TLS_MODEL_INITIAL_EXEC;
else
kind = is_local ? TLS_MODEL_LOCAL_DYNAMIC : TLS_MODEL_GLOBAL_DYNAMIC;
if (kind < flag_tls_default)
kind = flag_tls_default;
return kind;
}
(code edited by hand for brevity; actual source:
http://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/varasm.c#l5985 ).
The TLS_* values are such that TLS_MODEL_GLOBAL_DYNAMIC < TLS_MODEL_LOCAL_EXEC.
Thus, the implementation of -ftls-model allows to clamp storage to faster,
less general models, but does not allow to force slower, more general models.
This prevents building safely dlopen'able non-PIC shared objects without
resorting to using attributes to mark TLS data explicitely as global-dynamic.
This behavior is from day one as far as I could trace it:
http://gcc.gnu.org/ml/gcc-patches/2002-05/msg01912.html
It follows that the documentation is wrong or incomplete. I also think the
implementation should be changed to allow what the documentation promises.
I can fix either, but I need to know which. Please advise.
I'll also appreciate comments on whether the inability to set flag_shlib
without -fPIC is entirely intended and WONTFIX.
Thanks.
Alexander