Как скомпилировать код ржавчины как двоичный файл PI C, так как у ржавчины c нет флага -fPI C? - PullRequest
0 голосов
/ 11 апреля 2020

Я пытался скомпилировать код ржавчины, но ржавчина c распечатать эту ошибку:

relocation R_X86_64_32S cannot be used against local symbol; recompile with -fPIC

Но ржавчина c не имеет флага '-fPI C', так как я могу скомпилировать бинарный файл PI C с ржавчиной c?

Я пытался '- C relocation-model = pi c - C code-model = large', но все равно получаю эту ошибку.

РЕДАКТИРОВАТЬ:

Я понял ошибку! Я использую ассемблерный код в asm! макрос, и он использует какой-то адрес внешнего символа, поэтому ржавчина пытается использовать 'R_X86_64_32S', и поскольку двоичный файл связан с 0xffff800000000000, он вызывает ошибку.

EDIT2:

Этот код вызывает похожую ошибку:

#![feature(asm)]
fn main () 
{
    unsafe
    {
        asm! ("lea rax, [label]
              label:"
              :
              :
              :
              : "intel");
    }
}

Ошибка:

= note: /usr/bin/ld: main.main.7rcbfp3g-cgu.0.rcgu.o: relocation R_X86_64_32S against `.text._ZN4main4main17h9e0ea2b04575dfdbE' can not be used when making a PIE object; recompile with -fPIE

1 Ответ

0 голосов
/ 12 апреля 2020

Ошибки могут быть исправлены следующим образом:

Фиксированный код:

#![feature(asm)]
fn main () 
{
    unsafe
    {
        asm! ("call label
              label:
              pop rax"
              :
              :
              :
              : "intel");
    }
}

Дело в том, что вы не можете загрузить адрес метки напрямую, но вы должны использовать вызов pu sh этот адрес в стек, затем вытолкните адрес.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...