2015-07-29 15 views
5

Mam duży fragment kodu, który powoduje błędy podczas kompilacji przy użyciu -flto tylko w niektórych wersjach gcc. Postaram się streścić poniżejGCC -flto zmieniające widoczność symbolu

w file1.h

extern char A [100]; 

w file1.c

#include "file1.h" 
char A[100]; 

Mam też trochę kodu C++, który używa zmienna A. C++ kod jest kompilowany do pliku .o, a następnie całość jest skompilowany z czymś jak

gcc file1.c cpp.o 

Korzystanie wersję gcc na ArchLinux (5.2.0), nie ma problemu zarówno z jak i bez -flto. Jednak przy użyciu gcc na Ubuntu 14.04 (4.8.4), gdy kod jest kompilowany z -flto, A staje się zmienną lokalną. I sprawdzeniu, to z nm:

te są wynikiem nm a.out zmiennej mowa

Ubuntu nie Ito (Arch podobne, z różną liczbą):

00000000006162e0 B A 

Ubuntu LAby

00000000006092c0 b A.2722 

moim rozumieniu jest to, że B jest dla zmiennej globalnej, a b nie jest.

Jak mogę zapewnić, że A jest utrzymywany jako zmienna globalna, nawet jeśli używam -flto w systemie Ubuntu?

+0

aktualizuje opcję kompilator? Co powiesz na osobny plik obiektowy a.o zawierający bufor 'char a [100];', a wszystkie inne używają go 'extern'? – technosaurus

+0

Czy program działa zgodnie z oczekiwaniami w systemie Ubuntu? Czy testowałeś to, czy właśnie sprawdzasz tabele symboli? – idmean

+0

@idmean Program zdecydowanie kończy się niepowodzeniem w systemie Ubuntu, gdy jest uruchamiany z błędem wyszukiwania symbolu. –

Odpowiedz

2

Patrząc na this i this, to z pewnością wydaje się być błędem w konkretnej wersji gcc, z której korzystasz (gcc 4.8.4 jest dostarczany w pakiecie z Ubuntu 14.04).

Korzystanie z fragmentów kodu z pytania,
Byłem w stanie odtworzyć zachowanie na moim komputerze z systemem Ubuntu 14.04.

proste obejście tego celu jest zaznaczyć wyraźnie symbol w pytaniu jak used.

file1.c ma char A[100];

file2.c ma __attribute__((used)) char A[100];

gcc file1.c -o file1-default.o 
nm file1-default.o | grep "A$" 
0000000000601060 B A    <-- 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 B A    <-- symbol retained as global. 
+0

To działa dobrze. Dzięki. –