是否可以使用ocamlopt ghc和gcc编译器创建可移植的x86-64 Linux可执行文件?

斯顿17

在我的NixOS x86-64发行版上,我确定了四个“ hello world!” 应用程序使用:

  • ocamlopt编译器
  • ghc编译器
  • gcc编译器
  • 作为编译器

我的makefile文件:

  ocaml:
    ocamlopt mytest.ml -o ocaml_test

  haskell:
    ghc mytest.hs -o haskell_test

  ansiC:
    gcc mytest.c -o ansiC_test 

  asm:
    as -o asm_test.o mytest.s 
    ld -s -o asm_test asm_test.o

并且所有四个在本机上都可以正常工作

但是我无法在其他x86-64 Linux(准确地说是Lubuntu x86-64)计算机上执行前三个应用程序-我的应用程序无法在目标计算机上找到系统库,因此系统告诉我该文件不存在

但是文件存在,我可以通过readelf utilite读取它:


为gcc创建的可执行文件:

$> readelf -l ansiC_test 

Elf file type is EXEC (Executable file)
Entry point 0x401040
There are 11 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040
                 0x0000000000000268 0x0000000000000268  R      0x8
  INTERP         0x00000000000002a8 0x00000000004002a8 0x00000000004002a8
                 0x0000000000000050 0x0000000000000050  R      0x1
      [Requesting program interpreter: /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2]
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x00000000000004f0 0x00000000000004f0  R      0x1000

$> ldd ansiC_test 
  linux-vdso.so.1 (0x00007ffee735f000)
  libc.so.6 => /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/libc.so.6 (0x00007f8db6ca8000)
  /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2 => /nix/store/xvj2l5llpmcgx99cl37v5xqpazs38195-glibc-multi-2.27/lib/ld-linux-x86-64.so.2 (0x00007f8db6e60000)

为ghc创建的可执行文件:

$> readelf -l haskell_test

Elf file type is EXEC (Executable file)
Entry point 0x404c70
There are 11 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040
                 0x0000000000000268 0x0000000000000268  R      0x8
  INTERP         0x00000000000002a8 0x00000000004002a8 0x00000000004002a8
                 0x0000000000000050 0x0000000000000050  R      0x1
      [Requesting program interpreter: /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2]
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000

$> ldd haskell_test 
  linux-vdso.so.1 (0x00007ffe7840a000)
  libm.so.6 => /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/libm.so.6 (0x00007f13eb093000)
  libgmp.so.10 => /nix/store/7mrq5v4nnqfkv1ka7a0kdw9mzvqs5w3c-gmp-6.1.2/lib/libgmp.so.10 (0x00007f13eaffd000)
  librt.so.1 => /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/librt.so.1 (0x00007f13eaff3000)
  libdl.so.2 => /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/libdl.so.2 (0x00007f13eafee000)
  libffi.so.6 => /nix/store/kbbiky87bsdndh63m7919sxkf3gsh5zq-libffi-3.2.1/lib/libffi.so.6 (0x00007f13eafe1000)
  libpthread.so.0 => /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/libpthread.so.0 (0x00007f13eafbe000)
  libc.so.6 => /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/libc.so.6 (0x00007f13eae08000)
  /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2 => /nix/store/xvj2l5llpmcgx99cl37v5xqpazs38195-glibc-multi-2.27/lib/ld-linux-x86-64.so.2 (0x00007f13eb22b000)

为ocamlopt创建的可执行文件:

$> readelf -l ocaml_test

Elf file type is EXEC (Executable file)
Entry point 0x410730
There are 11 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040
                 0x0000000000000268 0x0000000000000268  R      0x8
  INTERP         0x00000000000002a8 0x00000000004002a8 0x00000000004002a8
                 0x0000000000000050 0x0000000000000050  R      0x1
      [Requesting program interpreter: /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2]
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x000000000000fb58 0x000000000000fb58  R      0x1000
$> ldd ocaml_test 
  linux-vdso.so.1 (0x00007ffc90657000)
  libm.so.6 => /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/libm.so.6 (0x00007f1b01f0b000)
  libdl.so.2 => /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/libdl.so.2 (0x00007f1b01f06000)
  libc.so.6 => /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/libc.so.6 (0x00007f1b01d50000)
  /nix/store/681354n3k44r8z90m35hm8945vsp95h1-glibc-2.27/lib/ld-linux-x86-64.so.2 => /nix/store/xvj2l5llpmcgx99cl37v5xqpazs38195-glibc-multi-2.27/lib/ld-linux-x86-64.so.2 (0x00007f1b020a3000)

而且我没有用汇编程序创建的可执行文件这个问题:

$> readelf -l asm_test

Elf file type is EXEC (Executable file)
Entry point 0x401000
There are 4 program headers, starting at offset 64

Program Headers:
  Type           Offset             VirtAddr           PhysAddr
                 FileSiz            MemSiz              Flags  Align
  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000
                 0x0000000000000140 0x0000000000000140  R      0x1000
  LOAD           0x0000000000001000 0x0000000000401000 0x0000000000401000
                 0x0000000000000022 0x0000000000000022  R E    0x1000
  LOAD           0x0000000000002000 0x0000000000402000 0x0000000000402000
                 0x000000000000000e 0x000000000000000e  RW     0x1000
  NOTE           0x0000000000000120 0x0000000000400120 0x0000000000400120
                 0x0000000000000020 0x0000000000000020  R      0x8

 Section to Segment mapping:
  Segment Sections...
   00     .note.gnu.property
   01     .text
   02     .data
   03     .note.gnu.property


$> ldd asm_test
  not a dynamic executable

如您所见,没有对glibc.so.x库的引用


我的问题是:是否可以用gcc,ghc和ocamlopt创建这样的“非动态可执行文件”应用程序文件?一些编译器的选项?也许在应用程序文件夹中的一些库?

我没有访问另一台机器的权限-我只能将tar.gz存档提供给最终用户-仅此而已。绝对不希望用户在自己的机器上安装ghc或ocaml

有什么建议?

仅供参考:src文件


haskell:

module Main where

main = putStrLn "hello world!"

ocaml:

print_string "hello world!" ;;
print_newline () ;;

ansi C:

#include <stdio.h>

int
main ()
{
  puts ("hello world!") ;
}

asm:

.code64
.global _start 

.text 

_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 
norok2

我还没有亲自测试过它,但是我认为-ccoptfromocamlopt)和-staticfromgcc的组合可以解决问题

  • ocamlopt手册
-ccopt option
    Pass the given option to the C compiler and linker. For instance,-ccopt -Ldir causes the C linker to search for C libraries in directory dir. 
  • gcc手册
-static
    On systems that support dynamic linking, this overrides -pie and prevents linking with the shared libraries. On other systems, this option has no effect.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用mingw-w64编译和链接32位Windows可执行文件

来自分类Dev

是否可以绕过已经编译的可执行文件所需的共享库依赖关系?

来自分类Dev

是否可以在Linux上为Mac创建可执行文件?

来自分类Dev

使用Intellij创建可执行文件.jar

来自分类Dev

如何生成可以在Unix和Linux上运行的可执行文件?

来自分类Dev

指定在Linux上启动可执行文件时使用的动态链接器/加载器

来自分类Dev

gfortran:在64位系统中编译32位可执行文件

来自分类Dev

x64可移植可执行文件不起作用

来自分类Dev

在64位计算机上使用静态链接库编译与位置无关的可执行文件

来自分类Dev

使用NASM编译Windows可执行文件

来自分类Dev

ARM Linux可执行文件神秘地在x86_64上运行

来自分类Dev

使用pyinstaller创建可执行文件时出错

来自分类Dev

我可以在Linux的Windows子系统(WSL)PATH中创建指向Windows可执行文件的符号链接吗?

来自分类Dev

是否可以使用net-core创建独立的可执行文件?

来自分类Dev

使用LLVM构建Coreutils期间,C编译器无法创建可执行文件

来自分类Dev

使用Qt 5,C ++和OpenCV从Linux创建可执行文件

来自分类Dev

MS Visual Studio Professional 2013-C ++可以为32位和64位操作系统编译单个可执行文件吗?

来自分类Dev

我可以在Linux的Windows子系统(WSL)PATH中创建指向Windows可执行文件的符号链接吗?

来自分类Dev

覆盖默认的/lib64/ld-linux-x86-64.so.2以调用可执行文件

来自分类Dev

在一种“风味”的Linux上编译的Linux可执行文件是否可以在另一种Linux上运行?

来自分类Dev

是否可以在基于yum或rpm的Linux上编译可移植可执行文件?

来自分类Dev

使用NASM编译Windows可执行文件

来自分类Dev

在Ubuntu中哪里可以找到IntelliJ IDEA 64位可执行文件?

来自分类Dev

无法使用可执行文件创建快照

来自分类Dev

如何链接 ocamlopt 生成的目标文件以创建可执行文件?

来自分类Dev

单个 gcc 可以为 x86、arm、ppc 等多个目标生成可执行文件吗?

来自分类Dev

是否可以在我的 python 可执行文件中包含解释器权限?

来自分类Dev

如何强制 gcc 编译器/链接器从可执行文件中删除未使用的静态数组

来自分类Dev

x64 C++ 可执行文件未在 nanoserver docker 容器中运行

Related 相关文章

  1. 1

    如何使用mingw-w64编译和链接32位Windows可执行文件

  2. 2

    是否可以绕过已经编译的可执行文件所需的共享库依赖关系?

  3. 3

    是否可以在Linux上为Mac创建可执行文件?

  4. 4

    使用Intellij创建可执行文件.jar

  5. 5

    如何生成可以在Unix和Linux上运行的可执行文件?

  6. 6

    指定在Linux上启动可执行文件时使用的动态链接器/加载器

  7. 7

    gfortran:在64位系统中编译32位可执行文件

  8. 8

    x64可移植可执行文件不起作用

  9. 9

    在64位计算机上使用静态链接库编译与位置无关的可执行文件

  10. 10

    使用NASM编译Windows可执行文件

  11. 11

    ARM Linux可执行文件神秘地在x86_64上运行

  12. 12

    使用pyinstaller创建可执行文件时出错

  13. 13

    我可以在Linux的Windows子系统(WSL)PATH中创建指向Windows可执行文件的符号链接吗?

  14. 14

    是否可以使用net-core创建独立的可执行文件?

  15. 15

    使用LLVM构建Coreutils期间,C编译器无法创建可执行文件

  16. 16

    使用Qt 5,C ++和OpenCV从Linux创建可执行文件

  17. 17

    MS Visual Studio Professional 2013-C ++可以为32位和64位操作系统编译单个可执行文件吗?

  18. 18

    我可以在Linux的Windows子系统(WSL)PATH中创建指向Windows可执行文件的符号链接吗?

  19. 19

    覆盖默认的/lib64/ld-linux-x86-64.so.2以调用可执行文件

  20. 20

    在一种“风味”的Linux上编译的Linux可执行文件是否可以在另一种Linux上运行?

  21. 21

    是否可以在基于yum或rpm的Linux上编译可移植可执行文件?

  22. 22

    使用NASM编译Windows可执行文件

  23. 23

    在Ubuntu中哪里可以找到IntelliJ IDEA 64位可执行文件?

  24. 24

    无法使用可执行文件创建快照

  25. 25

    如何链接 ocamlopt 生成的目标文件以创建可执行文件?

  26. 26

    单个 gcc 可以为 x86、arm、ppc 等多个目标生成可执行文件吗?

  27. 27

    是否可以在我的 python 可执行文件中包含解释器权限?

  28. 28

    如何强制 gcc 编译器/链接器从可执行文件中删除未使用的静态数组

  29. 29

    x64 C++ 可执行文件未在 nanoserver docker 容器中运行

热门标签

归档