【问题标题】:OCaml dynamic linking and -nodynlink compilation flagOCaml 动态链接和 -nodynlink 编译标志
【发布时间】:2020-11-25 22:01:37
【问题描述】:

根据OCaml User's Manual chapter on ocamlopt

-nodynlink 允许编译器使用一些优化,这些优化只对从不动态链接的代码有效。
...
-shared [...] 在某些系统下(目前只有 Linux AMD 64),插件中链接的所有 OCaml 代码必须在没有 -nodynlink 的情况下编译旗帜。 [...]

对我来说,这意味着:

  • “不使用-nodynlink 编译标志”的限制适用于插件。
  • 可以使用-nodynlink 编译非插件部分(正在扩展的应用程序)。

所以我的实际问题有两个:

  1. 我的上述解释正确吗?
  2. 当我故意违反上述限制时,编译器/加载器/等没有给我警告消息。由于我的不当行为,我会出现什么样的错误/不良行为?

提前谢谢你!

【问题讨论】:

    标签: ocaml dynamic-linking


    【解决方案1】:

    第一点是正确的。然而,许多现代操作系统默认使用 PIE 可执行文件,这与 -nodynlink 选项不兼容。

    关于您的第二点,在第二个位置指定 -shared 将删除 -nodynlink 标志,这可以解释为什么您没有收到任何错误。否则,对于非空插件,链接器应生成重定位错误。通常尝试编译

    let printer () = Format.printf "I am a plugin@."
    let () = Lib.register := printer :: !Lib.register
    

    # ocamlopt -shared -nodynlink plugin.ml -o plugin.cmxs 
    

    给我

    /usr/bin/ld: plugin.o: warning: relocation against `camlPlugin__Pfield_51' in >read-only section `.text'
    /usr/bin/ld: plugin.o: relocation R_X86_64_PC32 against symbol >`camlPlugin__const_block_11' can not be used when making a shared object; >recompile with -fPIC
    /usr/bin/ld: final link failed: bad value
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-30
      • 1970-01-01
      相关资源
      最近更新 更多