Объединение C и ассемблера (32-битный код) в 64-битной версии Linux

У меня 64-битная операционная система Ubuntu, и я изучаю 32-битную сборку. Я пытаюсь скомпилировать эти два файла:

кв.с:

#square.s

.section .text
.globl sqr
.type sqr, @function
sqr:
    pushl %ebp
    movl %esp, %ebp
    movl 8(%ebp), %eax
    imull %eax, %eax
    popl %ebp
    ret

основной.с :

//main.c
#include <stdio.h>
extern long sqr(long);
int main(int argc, char* argv[])
{
    long squared = sqr(10);
    printf("%lu\n", squared);
    return 0;
}

На моей 32-битной виртуальной машине я скомпилировал их с помощью этой команды

  gcc main.c square.s -o test

и это сработало. У меня проблема в том, что я хотел бы скомпилировать эти файлы на моей 64-битной машине. Я пробовал несколько способов компиляции этих файлов, но ни один из них не работал. Может кто-то указать мне верное направление? Есть ли возможность сделать это? Я пробовал -m32, но это не сработало.

Когда я делаю это:

  gcc -m32 -o test main.c square.s

Я получаю это:

  In file included from /usr/include/stdio.h:28:0,
             from main.c:1:
/usr/include/features.h:323:26: fatal error: bits/predefs.h: No such file or directory
compilation terminated.

person Hudson Worden    schedule 22.12.2011    source источник
comment
gcc -m32 -o test main.c square.s у меня работает, а у вас не работает?   -  person AusCBloke    schedule 22.12.2011
comment
Я не уверен... позвольте мне проверить еще раз   -  person Hudson Worden    schedule 22.12.2011
comment
OT, но я думаю, что push и pop не нужны   -  person phuclv    schedule 15.08.2013


Ответы (2)


Для компиляции/связывания 32-битной программы на 64-битной Ubuntu требуется gcc-multilib, попробуйте:

sudo apt-get install gcc-multilib libc6-i386 lib6-dev-i386

Однако у этого может быть другая проблема, когда вы пытаетесь связать другие библиотеки.

Вам больше повезет, если вы будете использовать 32-разрядную среду chroot (т. е. немного убунту).

person J-16 SDiZ    schedule 22.12.2011
comment
Спасибо! Однако способ, который вы сказали, не работал для меня. Вместо этого я просто сделал sudo apt-get install gcc-multilib, и это сработало. - person Hudson Worden; 22.12.2011

Похоже, ваша проблема связана с 32-битной компиляцией вообще, независимо от ассемблерного кода. Вероятно, что-то неправильно настроено.

Кроме того, вы рассматривали возможность использования встроенной сборки вместо файла .s? Таким способом намного проще интегрировать C и ассемблер, и вам не нужно беспокоиться о деталях соглашения о вызовах.

person ugoren    schedule 22.12.2011