У меня есть функция, определенная в сборке, которая вызывает функцию libc (swapcontext). Я вызываю эту функцию из моего кода C. Чтобы создать воспроизводимый пример, я использую вместо этого "put":
foo.S:
.globl foo
foo:
call puts
ret
test.c:
void foo(char *str);
int main() {
foo("Hello World\n");
return 0;
}
Скомпилировать:
gcc test.c foo.S -o test
Это нормально компилируется. Однако разборка двоичного файла результата показывает, что компоновщик не вставил действительную инструкцию вызова:
objdump -dR:
0000000000000671 <foo>:
671: e8 00 00 00 00 callq 676 <foo+0x5>
672: R_X86_64_PC32 puts@GLIBC_2.2.5-0x4
676: c3 retq
677: 66 0f 1f 84 00 00 00 nopw 0x0(%rax,%rax,1)
67e: 00 00
0000000000000530 <puts@plt>:
530: ff 25 9a 0a 20 00 jmpq *0x200a9a(%rip) # 200fd0 <puts@GLIBC_2.2.5>
536: 68 00 00 00 00 pushq $0x0
53b: e9 e0 ff ff ff jmpq 520 <.plt>
Исполнение:
./test1: Symbol `puts' causes overflow in R_X86_64_PC32 relocation
Segmentation fault
Есть идеи, почему?
objdump -dR test
может быть поучительным. Кроме того, разве вам не нуженret
в определенииfoo
? Кроме того,swapcontext
имеет ненормальный поток управления, вам нужно позаботиться о его безопасном вызове. - person zwol   schedule 28.08.2019.o
, используя параметр-r
, чтобы показать записи о перемещении. - person Michael Petch   schedule 28.08.2019# 200fd0 <swapcontext@GLIBC_2.2.5>
? - person S.S. Anne   schedule 29.08.2019