如果发现两个符号的名称相同,但属性不同,则可以进行复杂解析。在这些情况下,链接编辑器将选择最适合的符号并同时生成一条警告消息。此消息指出符号、发生冲突的属性以及包含符号定义的文件的标识。在以下示例中,包含数据项数组定义的两个文件有不同的大小要求。
$ cat foo.c int array[1]; $ cat bar.c int array[2] = { 1, 2 }; $ cc -dn -r -o temp.o foo.c bar.c ld: warning: symbol `array' has differing sizes: (file foo.o value=0x4; file bar.o value=0x8); bar.o definition taken |
如果符号的对齐要求不同,则会生成一个类似的诊断。在这两种情况下,使用链接编辑器的 -t 选项可以不进行诊断。
另一种属性差异是符号的类型。在以下示例中,符号 bar() 已同时定义为数据项和函数。
$ cat foo.c bar() { return (0); } $ cc -o libfoo.so -G -K pic foo.c $ cat main.c int bar = 1; main() { return (bar); } $ cc -o main main.c -L. -lfoo ld: warning: symbol `bar' has differing types: (file main.o type=OBJT; file ./libfoo.so type=FUNC); main.o definition taken |
此上下文中的符号类型是可以用 ELF 表示的类别。除非编程语言以最原始的方式使用数据类型,否则这些符号类型与数据类型无关。
在类似以上示例的情况下,在可重定位目标文件与共享库之间进行解析时将采用可重定位目标文件定义。或者,在两个共享库之间进行解析时采用第一个定义。在弱绑定符号或全局绑定符号之间进行这种解析时,还会生成警告。