В gcc doc указана одна причина использования section
. Эта причина to map to special hardware
. Но, похоже, это не мой случай.
Итак, я дал задание изменить общую библиотеку, которую мы используем в нашем проекте. Это библиотека 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")))
? Я понимаю, что section
говорит компилятору поместить переменную в определенный раздел. Однако какой смысл ставить 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")))
, и это помогло как-то.
<Ч />