Неопределенная ошибка ссылки в C внешнем ассемблере включена в C - PullRequest
0 голосов
/ 15 февраля 2019

Я включаю внешний asm в c, когда я пытаюсь скомпилировать, я получаю ошибку.

Я компилирую файл c следующим образом - g++ testing.c

Ошибка :

cc0FHCkn.o: testing.c :(. Text + 0xe): неопределенная ссылка на helloWorld collect2.exe: ошибка: ld вернул 1 состояние выхода

C код:

#include<stdio.h>
extern "C" int helloWorld();
int main() {
    printf("Its - ",helloWorld());
}

Код ASM:

.code
helloWorld proc
    mov rax, 123
    ret
helloWorld endp
end

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Примечание: я использую этот ответ, чтобы иметь возможность сказать больше, чем это возможно, с помощью замечания и использования gcc.

Во-первых, просто выполнить g++ testing.c g ++ невозможносвязать с файлом ассемблера, который не указан, поэтому, конечно, helloWorld отсутствует.


Если у меня есть файл hw.c :

int helloWorld()
{
  return 123;
}

Я прошу произвести ассемблер с помощью опции -S (я также использую -O для уменьшения размера исходного кода на ассемблере), поэтому мне не нужно писать файл на ассемблере вручную, и яуверен, что он совместим с gcc :

/tmp % gcc -O -S hw.c

, который произвел файл hw.s :

/tmp % cat hw.s
    .file   "hw.c"
    .text
.globl helloWorld
    .type   helloWorld, @function
helloWorld:
.LFB0:
    .cfi_startproc
    movl    $123, %eax
    ret
    .cfi_endproc
.LFE0:
    .size   helloWorld, .-helloWorld
    .ident  "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-16)"
    .section    .note.GNU-stack,"",@progbits
/tmp % 

Также с файлом mc :

#include <stdio.h>

extern int helloWorld();

int main()
{
  printf("%d\n", helloWorld());
  return 0;
}

Я могу сделать:

/tmp % gcc m.c hw.s
/tmp % ./a.out
123

Я предлагаю вам сделать то же самое, написать helloWorld в C, а затем сгенерировать ассемблер сопция -S, при этом вы обязательно соблюдаете требования gcc в определении функции

0 голосов
/ 15 февраля 2019

1.) Создайте объектный файл ELF из файла сборки

nasm -f elf64 -o assembly.o assembly.asm

2.) Создайте объектный файл ELF из файла testing.c

gcc -c testing.c -o testing.o

3.) СсылкаФайл объекта ELF вместе для создания окончательного исполняемого файла.

gcc -o testing assembly.o testing.o

4.) Запустите окончательный исполняемый файл

./testing

use extern int hellowrold ();

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