LINUX.ORG.RU

[c++] Длина имени секции

 


0

1

В одной из секций ELF-файла хранятся имена остальных секций. Индекс этой секции в секционном заголовке указан в ELF-заголовке. Допустим я знаю адрес этой секции и смещение в этой секции по которому находится нужное мне имя. Вопрос в том, где хранится число определяющее длину этого имени? В случаях которые я раньше встречал длина строки была прямо перед самой строкой. Тогда я просто считывал сначала длину, а затем имя. Как быть с именами секций ELF-файлов? Ведь перед именами секций стоят нули.


нигде. хошь узнать - пиши конфиг для ld, и сам туда пробивай, куда записать начало и конец секции.

ckotinko ☆☆☆
()

Ты из памяти читаешь или файла? Может посмотреть в libelf?

frey ★★
()

Обычные C-строки, так что strlen.

unsigned ★★★★
()

Читаю из файла.
Вот эта секций:
http://i001.radikal.ru/1103/0a/becf0763cf45.jpg
Мне нужно как то считать эти строки по отдельности. Для этого нужна их длина. Смещение в секционном заголовке указывает прямо на начало строки.
Допустим я перешел на начало строки с помощью seek. Как найти длину, которую нужно указать в качестве второго параметра read?

file.read((char*)&sectionName, ? );

Как можно тут применить strlen если сама строка еще не считана?

Digan
() автор топика
Ответ на: комментарий от Digan

Мне нужно как то считать эти строки по отдельности

Зачем? Не надо читать файл по одному слову.
Прочитай всю секцию (или отобрази mmap'ом), и прямо оттуда бери нужные строки. Заранее узнать длину ты не сможешь.

unsigned ★★★★
()

Хотелось бы обойтись без сторонних пакетов.

Вообще для своих целей я использую Qt. Думаю там должны быть свои аналоги. Просто я с ними пока не знаком.

Насчет считывания целой секции. Предположим я возьму такой вариант. Считаю в массив элементов типа char*. Затем в этом массиве перейду к началу нужного мне слова. Но я до сих пор не понимаю как оттуда брать слова по отдельности. Длина слова же все равно нужна..

Digan
() автор топика

Кажется я понял. Имена секций стоят между нуль-символами.

Поэтому можно в цикле считывать посимвольный пока не встретится нуль символ.

Встает вопрос. Как прописать условие?

while(currentChar != «\0») { }

Будет такой вариант работать?

Digan
() автор топика
Ответ на: комментарий от Digan

Общая идея:

char *symbols = new char[size];
read(fd, symbols, size);
// symbols[k] - C-строка со смещением k
size_t len = strlen(symbols[k]);
delete[] symbols;
Ты бы начал с чего попроще.

unsigned ★★★★
()

Вообще длина не понадобилась. Все оказалось проще чем я думал.

    //40 - размер записи в секционном заголовке
    //переходим к записи о размере нужной секции
    int pos = shOffset + (40 * (strSectionIndex - 1) + 20);
    file.seek(pos);
    int sectionSize = 0;
    //читаем размер нужной секции
    file.read((char*)&sectionSize, sizeof(int));

    //переходим к записи о смещении нужной секции
    pos = shOffset + (40 * (strSectionIndex - 1) + 16);
    file.seek(pos);
    int sectionOffset = 0;
    //читаем смещение нужной секции
    file.read((char*)&sectionOffset, sizeof(int));

    char *strSection = new char[sectionSize];
    //читаем секцию
    file.seek(sectionOffset);
    file.read(strSection, sectionSize);

    file.seek(shOffset + 0x00);
    file.read((char*)&sectionHeader.sh_name, sizeof(int));

    return &strSection[sectionHeader.sh_name];
Digan
() автор топика
Ответ на: комментарий от Digan

> Кажется я понял. Имена секций стоят между нуль-символами.

Поэтому можно в цикле считывать посимвольный пока не встретится нуль символ.


Да, ты точно QT-программист.

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.