Сбой GNU Assembler в подсистеме Windows для Linux - PullRequest
0 голосов
/ 23 октября 2018

Я хотел бы скомпилировать «Hello World» в подсистеме Windows для Linux (WLS) с Debian.

.text                        

    .global _start          


_start:


      movl    $len,%edx          
      movl    $msg,%ecx           
      movl    $1,%ebx             
      movl    $4,%eax             
      int     $0x80               



      movl    $0,%ebx             
      movl    $1,%eax            
      int     $0x80              

.data                          

msg:
    .ascii    "Hello, world!\n"   
    len = . - msg       

Если я скомпилирую на сервере Debian с

gcc -nostdlib -o hello hello.s

Itработает, но в WLS возвращается ошибка

/usr/bin/ld: /tmp/cciVVddg.o: relocation R_X86_64_32 against `.data' can not be used when making a shared object; recompile with -fPIC 
/usr/bin/ld: final link failed: Nonrepresentable section on output collect2: error: ld returned 1 exit status

Я тоже пробовал

gcc -fPIC -nostdlib -o hello hello.s

1 Ответ

0 голосов
/ 23 октября 2018

Есть две проблемы с вашим кодом:

  1. ваш код предназначен для 32-битного кода, но gcc пытается собрать его как 64-битный код.Вы можете исправить это, передав -m32 на всех этапах сборки и соединения.Помните, что WSL на самом деле не поддерживает 32-битный код, поэтому вы не сможете запустить вашу программу, даже если вам удастся собрать ее.
  2. gcc пытается сгенерировать независимый от позиции исполняемый файл.Чтобы ваш код работал в таком исполняемом файле, вам нужно написать независимый от позиции код. Для этого вам нужно избегать любых абсолютных ссылок на адреса переменных.В 32-битном коде это немного сложно, и я не буду объяснять это дальше, так как 32-битный код не будет работать на WSL в любом случае.Компилятор советует вам компилировать с -fpic, потому что это заставляет компилятор генерировать независимый от позиции код из файлов C, но для файлов сборки это неэффективно.Вы можете исправить эту проблему, связавшись с -no-pie, в результате чего компоновщик сгенерирует обычный двоичный файл, зависящий от позиции.Обратите внимание, что это по-прежнему не означает, что 32-разрядный двоичный файл будет работать в WSL.
...