Hi, I am still puzzled by the effect of LTO/-fwhole-program. For the following simple tests:
a.c: #include <stdio.h> int v; extern void bar(); int main() { v = 5; bar(); printf("v = %d\n", v); return 0; } b.c: int v; void bar() { v = 4; } If I just compile plainly, the output is: v = 4 If I compile as: ~/work/install-x86/bin/gcc a.c -O2 -c -save-temps -flto ~/work/install-x86/bin/gcc b.c -O2 -c -save-temps ~/work/install-x86/bin/gcc a.o b.o -O2 -fuse-linker-plugin -o f -flto -fwhole-program The output is: v = 5 We get two copies of v here. One is converted to static by whole-program optimizer, and the other is global. I know I can add externally_visible in a.c to solve the issue. But since compiler is not able to give any warning here, it could make program very tricky to debug. What is the value to convert variables to static ones? I know unreferenced ones can be optimized out, but this can be achieved by -fdata-sections & -gc-collection as well, I believe. Cheers, Bingfeng