Какой может быть смысл помещать переменную именно в секцию «STACK» с __attribute__ ((section («STACK»))?

В gcc docуказана одна причина использования секции.Эта причина для сопоставления со специальным оборудованием.Но это похоже не мой случай.

Поэтому я дал задание модифицировать общая библиотека, которую мы используем в нашем проекте.Это библиотека Linux.В библиотеке есть объявления переменных, которые меня озадачивают.Они выглядят так (примерно):

static int my_var_1 __attribute__((section("STACK"))) = 0;


Обновление 1:

Есть дюжина переменных таким образом ( __attribute__((section("STACK"))))



Обновление 2:
my_var_1

не является константой. my_var_1может быть изменен в коде во время инициализации:

my_var_1 = atoi(getenv("MY_VAR_1") ? getenv("MY_VAR_1") : "0");

далее в библиотеке он используется так:

inline void do_something() __attribute__((always_inline));
inline void do_something()
{
  if (my_var_1)
    do_something_else();
}


Какой смысл использовать __attribute__((section("STACK")))? Я понимаю, что раздел указывает компилятору поместить переменную в конкретный раздел.Однако какой смысл помещать static intименно в секцию "STACK"?


Обновление 3

Эти строки являются выдержкой из вывода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


Обновление 4

Удалось получить информацию от автора общей библиотеки. __attribute__((section("STACK")))был добавлен, так как ему не удалось собрать библиотеку на Solaris. Затем он нашел этот обходной путь. До обходного пути определение my_var_1было таким:

int my_var_1 = 0;

и все было в порядке. Затем он изменил ее, так как my_var_1фактически был нужен только в этой единице перевода:

static int my_var_1 = 0;

И после этого изменения он не смог собрать библиотеку на Solaris. Поэтому он добавил __attribute__((section("STACK"))), и это как-то помогло.


5
задан Sergei Kurenkov 30 March 2012 в 12:37
поделиться