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?
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
Czy program działa zgodnie z oczekiwaniami w systemie Ubuntu? Czy testowałeś to, czy właśnie sprawdzasz tabele symboli? – idmean
@idmean Program zdecydowanie kończy się niepowodzeniem w systemie Ubuntu, gdy jest uruchamiany z błędem wyszukiwania symbolu. –