Генерация %pc относительный адрес постоянных данных

Есть ли способ иметь gcc, генерируют %pc относительные адреса констант? Даже когда строка появляется в сегменте текста, arm-elf-gcc генерирует постоянный указатель на данные, загрузит адрес указателя через a %pc относительный адрес и затем разыменовывает его. По ряду причин я должен пропустить средний шаг. Как пример, эта простая функция:

const char * filename(void)
{
    static const char _filename[]
            __attribute__((section(".text")))
            = "logfile";
    return _filename;
}

генерирует (при компиляции с arm-elf-gcc-4.3.2 -nostdlib -c -O3 -W -Wall logfile.c):

00000000 <filename>:
   0:   e59f0000        ldr     r0, [pc, #0]    ; 8 <filename+0x8>
   4:   e12fff1e        bx      lr
   8:   0000000c        .word   0x0000000c

0000000c <_filename.1175>:
   c:   66676f6c        .word   0x66676f6c
  10:   00656c69        .word   0x00656c69

Я ожидал бы, что это генерирует что-то больше как:

filename:
    add r0, pc, #0
    bx lr
_filename.1175:
    .ascii "logfile\000"

Рассматриваемый код должен быть частично положением, независимым, так как это будет перемещено в памяти во время загрузки, но также и интегрироваться с кодом, который не был скомпилирован -fPIC, таким образом, нет никакой глобальной таблицы смещения.

Моя текущая работа вокруг должна назвать неподставляемую функцию (который будет сделан через a %pc относительный адрес) для нахождения смещения от скомпилированного местоположения в технике подобным, к как -fPIC работы кода:

static intptr_t
__attribute__((noinline))
find_offset( void )
{
    uintptr_t pc;
    asm __volatile__ (
            "mov %0, %%pc" : "=&r"(pc)
    );

    return pc - 8 - (uintptr_t) find_offset;
}

Но эта техника требует, чтобы все ссылки на данные были согласованы вручную, таким образом, filename() функция в вышеупомянутом примере стала бы:

const char * filename(void)
{
    static const char _filename[]
            __attribute__((section(".text")))
            = "logfile";
    return _filename + find_offset();
}
6
задан Hudson 30 May 2010 в 21:24
поделиться

1 ответ

Хммм, возможно, чтобы получить PIC, нужно скомпилировать его как -fPIC. Или просто написать его на ассемблере, ассемблер намного проще, чем Си, на котором вы пишете.

00000000 :
   0:   e59f300c    ldr r3, [pc, #12]   ; 14 
   4:   e59f000c    ldr r0, [pc, #12]   ; 18 
   8:   e08f3003    add r3, pc, r3
   c:   e0830000    add r0, r3, r0
  10:   e12fff1e    bx  lr
  14:   00000004    andeq   r0, r0, r4
  18:   00000000    andeq   r0, r0, r0

0000001c :
  1c:   66676f6c    strbtvs r6, [r7], -ip, ror #30
  20:   00656c69    rsbeq   r6, r5, r9, ror #24

Вы получаете то же предупреждение, что и я?

/tmp/ccySyaUE.s: Assembler messages:
/tmp/ccySyaUE.s:35: Warning: ignoring changed section attributes for .text
1
ответ дан 17 December 2019 в 22:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: