Czy istnieje sposób na wygenerowanie przez gcc %pc
względnych adresów stałych? Nawet jeśli ciąg pojawi się w segmencie tekstowym, arm-elf-gcc wygeneruje stały wskaźnik do danych, załaduje adres wskaźnika poprzez adres względny, a następnie usunie go. Z wielu powodów muszę pominąć środkowy krok. Jako przykład, ta prosta funkcja:Generowanie adresu% pc stałych danych
const char * filename(void)
{
static const char _filename[]
__attribute__((section(".text")))
= "logfile";
return _filename;
}
generuje (gdy skompilowany z 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
bym oczekuje się, aby wygenerować coś więcej takiego:
filename:
add r0, pc, #0
bx lr
_filename.1175:
.ascii "logfile\000"
kodu musi być częściowo niezależny od położenia, ponieważ zostanie przeniesiony do pamięci w czasie ładowania, ale także zintegrowany z kodem, który nie został skompilowany -fPIC
, więc Nie ma globalnej tabeli przesunięć.
Moja obecna praca wokół jest do wywołania funkcji non-inline (który będzie być wykonywane poprzez %pc
względnego adresu), aby znaleźć odsunięcie od skompilowanej umieszczeniem w technice podobny do tego, jak kod -fPIC
działa:
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;
}
Ale ta technika wymaga wszystko odniesienia danych ustala się ręcznie, więc funkcja w powyższym przykładzie filename()
staną:
const char * filename(void)
{
static const char _filename[]
__attribute__((section(".text")))
= "logfile";
return _filename + find_offset();
}
Tak, otrzymuję to samo ostrzeżenie. Najłatwiejszym hackowaniem jest dodanie fałszywego znaku nowej linii i dodanie komentarza: __attribute __ ((sekcja (".tekst \ n #"))). Nie można skompilować z opcją -fPIC, ponieważ istnieją funkcje w pamięci ROM, które znajdują się pod jawnymi adresami. Montaż działa dla mnie, ale nie dla innych użytkowników systemu ... – Hudson