我正在实现一个非常轻量级的pthread替换库。我想完全禁用__thread有几个原因。
%fs
寄存器。由于显而易见的原因,这在图书馆中是不可能的,但为什么它们应该是线程感知的呢?为什么不正确地设计它们,以便它们首先在参数列表中获得所需的上下文相关数据?我的问题很简单:如果您不小心使用它,禁用__thread支持并使clang发出错误的最简单方法是什么?如果加载一个恰好需要TLS的动态库,我怎么会出错?
答案 0 :(得分:3)
我认为最简单的方法是无条件地向你的CFLAGS添加这样的东西(如果你希望它是系统全局的,可能来自clang相当于gcc规范文件):
-D__thread='^-^'
其中右侧可以是C程序中任何时候语法无效(违反约束)的任何内容。
至于使用TLS阻止加载库,您必须修补链接器和/或动态链接器以拒绝它们。如果您只是在讨论dlopen
,那么您的程序可以首先读取该文件并解析ELF标头以进行TLS重定位,然后拒绝该库(不将其传递给dlopen
)(如果有的话)。使用LD_PRELOAD
包装器甚至可以实现这一点。
我同意你的看法,特别是在目前的实施中,TLS是一般应该避免使用的东西,但是我可以问你是否测量了成本?我认为在设计使用它的系统上将完全标记出来将是相当困难的,并且在减少膨胀方面有很多悬而未决的成果。您使用的是哪个libc?如果它是glibc,我很确定glibc现在有很多内部使用的TLS ......当然如果你正在编写自己的线程实现,这将需要与标准库的其余部分进行大量的交互,所以也许你已经把它修补了......?
顺便说一下(无耻插件),an extremely light-weight threads implementation中musl libc目前没有TLS。我认为与其他libc集成并不容易(我敢肯定,如果你自己编写,你会发现很难与glibc集成,尤其是glibc的动态链接器,它希望支持TLS)但是如果您可以按原样使用整个库,它可能满足您对特定项目的需求,或者您可以借用有用的代码(许可证是麻省理工学院)。