In gcc doc jeden powód jest podany przy użyciu section
.To jest powód to map to special hardware
. Ale wydaje się, że nie moja sprawa:
Co może być przyczyną umieszczenia zmiennej dokładnie w sekcji "STACK" z __attribute__ ((sekcja ("STACK"))?
Tak więc podjąłem zadanie modyfikacji biblioteki współdzielonej, której używamy w naszym projekcie.Jest to biblioteka systemu Linux.Biblioteczki, które mnie puzzelują, zawierają zmienne deklaracje, które wyglądają tak (w przybliżeniu):
static int my_var_1 __attribute__((section("STACK"))) = 0;
aktualizacji 1:
Istnieje kilkanaście zmiennych zdefiniowanych w ten sposób (
__attribute__((section("STACK")))
)
Aktualizacja 2:
my_var_1
nie jest stała.
my_var_1
może być zmieniona w kodzie podczas inicjalizacji:
my_var_1 = atoi(getenv("MY_VAR_1") ? getenv("MY_VAR_1") : "0");
później w bibliotece jest używany tak:
inline void do_something() __attribute__((always_inline));
inline void do_something()
{
if (my_var_1)
do_something_else();
}
Co może być punktem w użyciu __attribute__((section("STACK")))
? Rozumiem, że section
mówi kompilatorowi, aby umieścić zmienną w konkretnej sekcji. Jednak jaki może być sens umieszczenia static int
dokładnie w sekcji "STACK"?
Update 3
Linie te są fragmentem wyjściu z
readelf -t my_lib.so
[23] .got.plt
PROGBITS 00000000002103f0 00000000000103f0 0
00000000000003a8 0000000000000008 0 8
[0000000000000003]: WRITE, ALLOC
[24] .data
PROGBITS 00000000002107a0 00000000000107a0 0
00000000000000b0 0000000000000000 0 16
[0000000000000003]: WRITE, ALLOC
[25] STACK
PROGBITS 0000000000210860 0000000000010860 0
00000000000860e0 0000000000000000 0 32
[0000000000000003]: WRITE, ALLOC
[26] .bss
NOBITS 0000000000296940 0000000000096940 0
0000000000000580 0000000000000000 0 32
[0000000000000003]: WRITE, ALLOC
Update 4
udało się uzyskać informacje od autora udostępnionej biblioteki .
__attribute__((section("STACK")))
został dodany, ponieważ nie udało mu się zbudować biblioteki w systemie Solaris. Potem znalazł to obejście. Przed obejście definicja
my_var_1
było jak:
int my_var_1 = 0;
i wszystko było OK. Potem zmienił go od my_var_1
był w rzeczywistości potrzebna tylko w tej jednostce Tłumaczenie:
static int my_var_1 = 0;
A po takiej zmianie, że nie udało się zbudować bibliotekę w systemie Solaris. Więc dodał __attribute__((section("STACK")))
i jakoś pomógł.
Czy Twój projekt działa na zwykłym komputerze z procesorem x86, czy jest to coś w rodzaju systemu ARM na chipie (SoC)? Czy możesz znaleźć skrypt linkera (używany przez ld, a więc zwykle kończy się na ".ld")? To jednoznacznie umieści sekcję STACK w obszarze pamięci, więc znalezienie skryptu linkera da więcej wskazówek. – gbulmer
Program jest używany na zwykłych serwerach x64_86 i na HP-UX Itanium2. Brak systemów ARM. –
może być warte dodania informacji o maszynach na twoje pytanie. Mogę sobie wyobrazić, że Itanium2 _might_ uruchamia coś (wiem bardzo mało o tym, ale jest inaczej :-) – gbulmer