1

我想用 Debian 在 Windows Subsystem for Linux (WLS) 中编译“Hello World”。

.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

它可以工作,但在 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
4

1 回答 1

2

您的代码有两个问题:

  1. 您的代码旨在为 32 位代码,但gcc尝试将其组装为 64 位代码。您可以通过传递-m32装配和链接的所有阶段来解决此问题。请记住,WSL 实际上并不支持 32 位代码,因此即使您设法组装它,您也无法运行您的程序。
  2. gcc尝试生成与位置无关的可执行文件。要使您的代码在这样的可执行文件中工作,您需要编写与位置无关的代码。 为此,您需要避免对变量地址的任何绝对引用。在 32 位代码中,这有点棘手,我不打算进一步解释这一点,因为 32 位代码无论如何都不会在 WSL 上运行。编译器建议您编译,-fpic因为这会导致编译器从 C 文件生成与位置无关的代码,但对于汇编文件它是无效的。您可以通过与 链接来解决此问题-no-pie,从而使链接器生成正常的位置相关二进制文件。请注意,这并不意味着 32 位二进制文​​件将在 WSL 中运行。
于 2018-10-23T10:12:43.077 回答