对于指导书中给出的强定义第二条和第三条:
2. 能被其它目标文件发现。即 Symbol 的 bind
为STB_GLOBAL
;
3. 存在初值。即 Symbol
的index
不为 SHN_UNDEF 或
SHN_COMMON`。
我对于 2,3 用了一个 if 一起判断:if (sym.bind != STB_GLOBAL || sym.index == SHN_UNDEF || sym.index == SHN_COMMON) 不为全局、是未定义的、是常见的,三者满足其一就不是强定义的,返回 NO_DEF,但这样写 test 并没有通过;
当我把 if 改成 if(sym.bind == STB_GLOBAL && (sym.index==SHN_UNDEF||sym.index==SHN_COMMON)) 符号的绑定类型是全局,并且它的索引是未定义或常见块之一。只有当符号同时满足这两个条件时,才不是强定义的返回 NO_DEF,test 神奇的通过了。
但我始终不理解,第二个 if 的判定条件不是只包含了满足条件 2 但不满足条件 3 的情况吗?为什么第一个通过不了而第二个通过了?
还是我已经写晕了,被绕进去了