linux 如何使用Common Lisp转储静态可执行文件?

l0oc07j2  于 2023-04-20  发布在  Linux
关注(0)|答案(2)|浏览(211)

我使用的是SBCL,尽管我看到其他实现也有类似的功能。我可以转储一个不需要安装Lisp实现,但依赖于标准C库的可执行文件。我如何使转储的图像静态链接(即没有任何依赖关系)?
当我使用完一个图像后,我可以调用

(save-lisp-and-die "image-name" :executable t)

这将在我的目录中留下一个名为image-name的文件,然后我可以用./image-name调用。我将被放入一个repl中,并且我在saving-lisp-an-dying之前所做的一切都将仍然存在。我的问题是,当我将此文件移动到另一台机器时,我无法运行它。要么我得到'file not found'错误,或者我被告知安装了错误的GLIBC版本。在映像上运行file显示它是动态链接的。有没有一种方法可以转储静态链接的映像,我可以直接复制到任何具有Linux内核的机器上?

gdx19jrr

gdx19jrr1#

生成动态链接的可执行文件

(save-lisp-and-die "image-name" :executable t)

然后使用其中一个differents ways to generate a statically linked executable from a dynamically linked executable
我试过packelf.sh,它工作得很好!

sdnqo3pr

sdnqo3pr2#

save-lisp-and-die的一个很好的补充工具是Deploy
您遇到了什么样的“文件未找到”消息?Deploy有助于将外部库依赖项与二进制文件一起发布,例如libssl.so或libmagic.so,因此它们不需要与目标操作系统上的版本完全相同,或者根本不需要。
要使用它,您需要调整.asd声明并用途:

:defsystem-depends-on (:deploy)  ;; (ql:quickload "deploy") before
:build-operation "deploy-op"     ;; instead of "program-op"
:build-pathname "my-application-name"  ;; doesn't change
:entry-point "my-package:my-start-function"  ;; doesn't change

然后像往常一样用(asdf:make :my-app)构建二进制文件。
Deploy会创建一个bin/目录,其中包含了你的二进制文件和依赖项。这就是你现在要发布的内容。
应该可以将所有内容打包到一个可执行的归档文件中,但我还没有做到这一点。
更多信息:https://lispcookbook.github.io/cl-cookbook/scripting.html#with-deploy---ship-foreign-libraries-dependencies
我们实际上并没有使用libssl,所以我们告诉Deploy忽略它:

#+linux (deploy:define-library cl+ssl::libssl :dont-deploy T)
#+linux (deploy:define-library cl+ssl::libcrypto :dont-deploy T)

使用(push :deploy-console *features*)在启动时静默Deploy。

相关问题