汇编定义Thread Local Storage报错“非空字符串存入.tbss”原因咨询
汇编TBSS段错误“attempt to store non-empty string in section `.tbss'”原因及解决
错误原因
你当前的汇编代码顺序有误:.LOCALMAP:标签定义放在了.section .tbss指令之前,导致这个标签被归属到了之前的代码段(比如.text),而非目标的.tbss段。后续在.tbss段中对LOCALMAP符号进行类型、大小声明并分配空间时,汇编器会因为符号归属段不匹配,误将标签相关信息当作非空字符串尝试存入.tbss段——而.tbss是@nobits类型的段,仅允许存放未初始化的零值数据,不能包含任何非空内容,因此触发错误。
另外,在AFL的afl-as.h环境中,汇编器对段切换和符号定义的顺序要求严格,跨段的符号定义会打破段规则检查,进而引发这类错误。
修正后的代码
调整指令顺序,先切换到.tbss段,再定义标签:
" .section .tbss,\"awT\",@nobits\n" " .LOCALMAP:\n" " .type LOCALMAP,@object\n" " .size LOCALMAP,8\n" " .zero 8\n"
补充说明
.tbss是线程本地存储的未初始化数据段,@nobits标记意味着该段在目标文件中不占用实际磁盘空间,仅在程序运行时分配内存并初始化为零。- 在AFL汇编器环境中,所有线程本地存储的符号必须严格归属到
.tbss段,符号定义必须紧跟在.section切换指令之后,避免跨段符号冲突。
内容的提问来源于stack exchange,提问作者Simon
相关产品推荐
相关产品推荐

