Tengo un gran fragmento de código que produce errores cuando se compila usando -flto solo en algunas versiones de gcc. Trataré de resumir a continuación
en archivo1.h
extern char A [100];en archivo1.c
#include "file1.h" char A[100]; También tengo un código C++ que usa la variable A . El código C++ se compila en un archivo .o , y luego todo se compila con algo como
gcc file1.c cpp.o Usando la versión de gcc en archlinux (5.2.0), no hay problema con y sin -flto . Sin embargo, al usar gcc en Ubuntu 14.04 (4.8.4), cuando el código se compila con -flto , A se convierte en una variable local. He verificado esto con nm:
Estos son los resultados de nm a.out para la variable en cuestión
Ubuntu, no lto (arco similar, con un número diferente):
00000000006162e0 BAUbuntu, lto
00000000006092c0 b A.2722 Tengo entendido que la B es para una variable global y la b no lo es.
¿Cómo puedo asegurarme de que A se mantenga como una variable global incluso cuando uso -flto en Ubuntu?
Mirando esto y esto , ciertamente parece ser un error dentro de la versión particular de gcc que está utilizando (gcc 4.8.4 viene incluido con Ubuntu 14.04).
Usando los fragmentos de código de la pregunta,
Pude reproducir el comportamiento en mi máquina con Ubuntu 14.04.
Una solución simple para esto es marcar explícitamente el símbolo en cuestión como
used.
file1.c tiene el char A[100];
file2.c tiene __attribute__((used)) char A[100];
gcc file1.c -o file1-default.o nm file1-default.o | grep "A$" 0000000000601060 BA <-- symbol is a global. gcc file1.c -flto -o file1-flto.o nm file1-flto.o | grep "A$" 0000000000601060 b A.2385 <-- symbol updated to a local. gcc file2.c -flto -o file2.o nm file2.o | grep "A$" 0000000000601060 BA <-- symbol retained as global.