@DVoropaev
Ставлю + к карме на хабре за ответы на вопросы

Почему не компилируется код на ассемблере в gcc?

gcc ./hello.s 
/usr/bin/ld: /tmp/ccFwCm6W.o: relocation R_X86_64_32 against '.data' can not be used when making a PIE object; перекомпилируйте с параметром -fPIC
/usr/bin/ld: final link failed: Раздел, непредставимый для вывода
collect2: error: ld returned 1 exit status

gcc -fPIC ./hello.s
/usr/bin/ld: /tmp/ccnyVBXc.o: relocation R_X86_64_32 against '.data' can not be used when making a PIE object; перекомпилируйте с параметром -fPIC
/usr/bin/ld: final link failed: Раздел, непредставимый для вывода
collect2: error: ld returned 1 exit status


Код брал с викиучебника. Компилировать его предполагается так:
[user@host:~]$ gcc hello.s -o hello
[user@host:~]$ ./hello
Hello, world!

Код программы выглядит так:
.data                         /* поместить следующее в сегмент данных
                                                                    */
 
hello_str:                    /* наша строка                        */
        .string "Hello, world!\n"
 
                              /* длина строки                       */
        .set hello_str_length, . - hello_str - 1
 
.text                         /* поместить следующее в сегмент кода */
 
.globl  main                  /* main - глобальный символ, видимый
                                 за пределами текущего файла        */
.type   main, @function       /* main - функция (а не данные)       */
 
 
main:
        movl    $4, %eax      /* поместить номер системного вызова
                                 write = 4 в регистр %eax           */
 
        movl    $1, %ebx      /* первый параметр - в регистр %ebx;
                                 номер файлового дескриптора 
                                 stdout - 1                         */
 
        movl    $hello_str, %ecx  /* второй параметр - в регистр %ecx;
                                     указатель на строку            */
 
        movl    $hello_str_length, %edx /* третий параметр - в регистр
                                           %edx; длина строки       */
 
        int     $0x80         /* вызвать прерывание 0x80            */
 
        movl    $1, %eax      /* номер системного вызова exit - 1   */
        movl    $0, %ebx      /* передать 0 как значение параметра  */
        int     $0x80         /* вызвать exit(0)                    */
 
        .size   main, . - main    /* размер функции main            */
  • Вопрос задан
  • 111 просмотров
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
перекомпилируйте с параметром -fPIC
gcc -fPIC ./hello.s

"перекомпилируйте" в данном контексте означает "сгенерируйте другой ассемблерный код".

Код программы выглядит так:

Ну это же явно 32-битный код, компилируй его под 32 бита:
gcc -m32 hello.s -o hello
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы