OCaml动态链接和-nodynlink编译标志

OCaml动态链接和-nodynlink编译标志,ocaml,dynamic-linking,Ocaml,Dynamic Linking,根据报告: -nodynlink允许编译器使用一些仅对从未动态链接的代码有效的优化。 … -shared[…]在某些系统(目前只有Linux AMD 64)下,插件中链接的所有OCaml代码必须在编译时没有-nodynlink标志。[……] 对我来说,这意味着: “请勿使用-nodynlink编译标志”限制仅适用于插件 非插件部分(正在扩展的应用程序)可以使用-nodynlink进行编译 因此,我的实际问题有两个: 我的上述解释正确吗 当我故意违反上述限制时,编译器/loader/etc没有

根据报告:

-nodynlink
允许编译器使用一些仅对从未动态链接的代码有效的优化。

-shared
[…]在某些系统(目前只有Linux AMD 64)下,插件中链接的所有OCaml代码必须在编译时没有
-nodynlink
标志。[……]

对我来说,这意味着:

  • “请勿使用
    -nodynlink
    编译标志”限制仅适用于插件
  • 非插件部分(正在扩展的应用程序)可以使用
    -nodynlink
    进行编译
因此,我的实际问题有两个:

  • 我的上述解释正确吗
  • 当我故意违反上述限制时,编译器/loader/etc没有给我一条警告消息。我的错误行为会导致什么样的错误/不良行为

  • 提前谢谢你

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

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

    let printer()=Format.printf“我是一个plugin@."
    let()=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