【问题标题】: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 编译非插件部分(正在扩展的应用程序)。
所以我的实际问题有两个:
- 我的上述解释正确吗?
- 当我故意违反上述限制时,编译器/加载器/等没有给我警告消息。由于我的不当行为,我会出现什么样的错误/不良行为?
提前谢谢你!
【问题讨论】:
标签:
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