Почему раздел .data.rel.ro занимает так много места в моем исполняемом файле?Linux

Ответить
Anonymous
 Почему раздел .data.rel.ro занимает так много места в моем исполняемом файле?

Сообщение Anonymous »

Я хочу создать общую библиотеку в Linux, которая содержит большой инициализированный массив, и использовать этот массив в разных исполняемых файлах.
Я ожидаю, что это позволит уменьшить размер вывода компиляции, особенно если несколько программ используют эти данные .
К сожалению, это не тот случай, когда данные в общем объекте помечены как доступные только для чтения.
Вот мой символ табуляции 4Mib внутри объект:

Код: Выделить всё

$ nm --print-size bigfile.o
0000000000000000 0000000000400000 R tab
Я использую ld для создания общего объекта:

Код: Выделить всё

ld -o libbigfile.so -shared bigfile.o
И в результате получается исполняемый файл 4M при связывании с

Код: Выделить всё

gcc -o bigfile main.o libbigfile.so
И ответственность за это, судя по всему, лежит на .data.rel.ro

Код: Выделить всё

$ readelf --section-headers bigfile
[21] .data.rel.ro      PROGBITS         0000000000403dc0  00002dc0
0000000000400000       0000000000000000 WA       0     0     64
Но поскольку я могу проверить с помощью readelf -x .data.rel.ro bigfile, .data.rel.ro полон 0x00.
Итак, если содержимое раздела .rodata общего объекта, если оно копируется только во время загрузки, почему оно занимает это место в исполняемом двоичном файле, а не выделяется во время загрузки, как это делает .bss?
Как воспроизвести:
У меня очень простой основной:

Код: Выделить всё

#include 

extern char tab[];

int main() {
puts(tab);
return 0;
}
Я создаю свой общий объект из файла C или сборки, но файл сборки меньше (к сожалению, в C нет префикса «times»), поэтому вот версия сборки:

Код: Выделить всё

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]
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Linux»