D
D
DVoropaev2019-07-06 15:19:58
linux
DVoropaev, 2019-07-06 15:19:58

Why doesn't the assembler code compile in 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

The code was taken from wikibook . It is supposed to be compiled like this:
[[email protected]:~]$ gcc hello.s -o hello
[[email protected]:~]$ ./hello
Hello, world!

The program code looks like this:
.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            */

Answer the question

In order to leave comments, you need to log in

[[+comments_count]] answer(s)
J
jcmvbkbc, 2019-07-06
@DVoropaev

recompile with -fPIC
gcc -fPIC ./hello.s

"recompile" in this context means "generate different assembler code".
Well, this is clearly 32-bit code, compile it for 32 bits:
gcc -m32 hello.s -o hello

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question