Я ожидаю, что это позволит уменьшить размер вывода компиляции, особенно если несколько программ используют эти данные .
К сожалению, это не тот случай, когда данные в общем объекте помечены как доступные только для чтения.
Вот мой символ табуляции 4Mib внутри объект:
Код: Выделить всё
$ nm --print-size bigfile.o
0000000000000000 0000000000400000 R tab
Код: Выделить всё
ld -o libbigfile.so -shared bigfile.oКод: Выделить всё
gcc -o bigfile main.o libbigfile.soКод: Выделить всё
$ readelf --section-headers bigfile
[21] .data.rel.ro PROGBITS 0000000000403dc0 00002dc0
0000000000400000 0000000000000000 WA 0 0 64
Итак, если содержимое раздела .rodata общего объекта, если оно копируется только во время загрузки, почему оно занимает это место в исполняемом двоичном файле, а не выделяется во время загрузки, как это делает .bss?
Как воспроизвести:
У меня очень простой основной:
Код: Выделить всё
#include
extern char tab[];
int main() {
puts(tab);
return 0;
}
Код: Выделить всё
global tab:data BYTESIZE
BYTESIZE equ (1
Подробнее здесь: [url]https://stackoverflow.com/questions/79246559/why-does-the-data-rel-ro-section-takes-so-much-space-in-my-executable[/url]
Мобильная версия