В gcc docуказана одна причина использования секции
.Эта причина для сопоставления со специальным оборудованием
.Но это похоже не мой случай.
Поэтому я дал задание модифицировать общая библиотека, которую мы используем в нашем проекте.Это библиотека Linux.В библиотеке есть объявления переменных, которые меня озадачивают.Они выглядят так (примерно):
static int my_var_1 __attribute__((section("STACK"))) = 0;
Есть дюжина переменных таким образом ( __attribute__((section("STACK")))
)
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"?
Эти строки являются выдержкой из вывода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
Удалось получить информацию от автора общей библиотеки.
__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")))
, и это как-то помогло.