Почему строковые константы хранятся в секции .text в dll? - PullRequest
2 голосов
/ 04 июля 2019

Я учусь декомпилировать и анализировать файл dll с именем d3d9.dll, поскольку я знаю, что строковые константы хранятся в разделе .rdata для dll, но, как показано ниже (окно строк IDA), они хранятся в разделе .text.Я не знаю, почему это так.И когда они хранятся в .rdata, а когда в .text?

.text:4FE45850  00000050    C   Declaration can't map to legacy FVF because a nonzero stream index is used: %d. 

.text:4FE458A0  0000007B    C   Declaration can't map to fixed function FVF because fixed function pipeline does not support generation methods %s or %s. 

.text:4FE45920  000000B9    C   Declaration can't map to fixed function FVF because fixed function requires that generation methods %s, %s or %s can only be used with type %s and usage being one of: %s, %s, %s or %s.

.text:4FE459E0  0000008D    C   Declaration can't map to fixed function FVF because fixed function requires that generation method %s can only be used with usages %s or %s. 

.text:4FE45A70  000000A3    C   Declaration can't map to fixed function FVF because gaps or overlap between vertex elements are not allowed. Offset encountered is: %d, but expected offset is %d.

.text:4FE45B18  0000005E    C   Declaration can't map to fixed function FVF because the type for this element is unsupported.

.text:4FE45B78  00000072    C   Declaration can't map to fixed function FVF because a generation method other than D3DDECLMETHOD_DEFAULT is used.

Ответы [ 2 ]

3 голосов
/ 04 июля 2019

Это обычная оптимизация. Заголовки разделов занимают немного места, поэтому может быть полезно избежать использования .rdata. Раздел .text имеет все необходимые атрибуты, он доступен только для чтения и инициализирован. У него также есть дополнительный атрибут execute, но это не мешает. Так что нет никакого технического барьера, который мешает компилятору вставлять строки в .text, и небольшое преимущество.

1 голос
/ 04 июля 2019

От компилятора зависит, как и где он хранит какие-либо данные. Например, если вы берете эту короткую программу:

#include <stdio.h>

int main()
{
        char text[] = "Hey";
        puts(text);
}

Скомпилированный с оптимизацией, gcc полностью удаляет строку для любого раздела и просто сохраняет ее в байтах - полученная сборка:

    movl    $7955784, 4(%rsp)
    call    puts@PLT

Он может видеть, что к строке не нужно нигде обращаться, так что оптимизацию такого рода можно выполнять.

...