LINUX.ORG.RU

Изменить размер сегмента данных объектного файла

 , , ,


1

5

Здравствуйте, есть такая задача. Изменить размер сегмента данных в объектном файле. То есть в файле созданным без линковки gcc -c test.c. Сразу скажу честно, задание учебное. Я понимаю принцип расположения всех сегментов,как их посмотреть, как они буду отображены в памяти ( но тут сейчас не все так однозначно, так как используется ASLR). Знаю системные вызовы brk / sbrk , но они же исполняютс в рантайме из программы. Как изменить размер объектного файла + чтобы не повредить программу. Еще такой вопрос, почему в объектнике сегмент данных (именно .data, а не .rodata) записаны нули, если он этот сегмент вообще присутствует. Хотя инициализированные переменные присутсвуют в сорцах. Подскажите пожалуйста, куда смотреть, чтобы сделать задание и объясните на счет вопросов. Спасибо заранее.



Последнее исправление: CROSP (всего исправлений: 1)

А что мешает прилинковать файл с инициализированными нулями данными нужного размера? ld -r -o somethingnew.o test.o data.o

io ★★
()

Еще такой вопрос, почему в объектнике сегмент данных (именно .data, а не .rodata) записаны нули, если он этот сегмент вообще присутствует. Хотя инициализированные переменные присутсвуют в сорцах.

Значит они инициализированны нулями, а инициализированные ненулями дадут ненуливое содержание в .data

jederhasstmich
()
Ответ на: комментарий от io

Подскажите пожалуйста как сделать объектник с нулями в дате. Просто написать исходник инициализировать глобальные переменные нулями и потом соединить два файла ?

CROSP
() автор топика
Ответ на: комментарий от CROSP
$ cat data.c
char data[1024*1024]={0};
int main(){return 0;}
$ gcc -fno-zero-initialized-in-bss -c data.c
$ objdump -h data.o | grep -A1 \\.data
  1 .data         00100000  0000000000000000  0000000000000000  00000080  2**6
                  CONTENTS, ALLOC, LOAD, DATA
anonymous
()
Ответ на: комментарий от CROSP

Можно как предложено выше. Можно указать секцию:

static char u[1024*1024] __attribute__((section(".data"))) = {0};
static дабы не порождать лишних глобальных имен естественно. проверить результат можно даже ls-ом или тем же objdump как вышe:
$ gcc -c data.c 
$ ls -la data.o
-rw-r--r-- 1 io io 1049538 нояб. 10 10:10 data.o

io ★★
()
Ответ на: комментарий от CROSP

Можно породить также файл следующего вида:

$ more xxx.o
SECTIONS
{
  .data :
  {
    *(.data)
    . = . + 0x100000;
  }
}

Его можно использовать вместо обычного объектника:

$ ld -r -o mainx.o main.o xxx.o
$ ls -la main.o mainx.o
-rw-r--r-- 1 io io    1224 нояб. 10 10:17 main.o
-rw-r--r-- 1 io io 1049813 нояб. 10 11:09 mainx.o
io ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.