我想制作一个“便携式”版本的 Emacs 24.3。我正在使用一些 Debian 7 系统,但我没有 root 访问权限。由于 Debian 7 缺少 Emacs 24,我想构建一个便携式版本,可以通过 USB 拇指驱动器随身携带。我的具体问题是:
- 我可以使安装前缀灵活,还是通过硬连线
configure --prefix=...
? - 如何将所有必需的
.so
文件与安装捆绑在一起?
答案1
我有几种方法可以做到这一点,首先是简单的方法:
使安装前缀灵活很困难 - 我只需将安装前缀设置为您的主目录,或者您可以在任何计算机上访问的某个位置,然后使用
make install DESTDIR=/path/to/place/where/binaries/should/be/installed
将它们安装到前缀以外的位置。
我个人将二进制文件放在 中$HOME/bin
,所以我的命令如下所示:
./configure --prefix=$HOME
有些程序(我知道 FFmpeg 就是其中之一)可以使用编译到程序中的所有库来构建,从而避免共享库。在 ffmpeg 的情况下(也可能是其他情况),配置标志是--disable-shared --enable-static
.
您可以用来ldd (name-of-binary-file)
检查它需要哪些共享对象,并将它们复制到您的闪存驱动器。
编辑1
我刚刚找到了一种方法来仅获取所链接的库的名称,这非常有帮助。
ldd binary-name|sed 's/=>.*//'|sed 's/\t//'|sed 's/\ (0x.*//'
将获得链接到的所有库的列表。
此外,这只会为您提供具有硬编码路径的文件:
ldd binary-name|sed 's/=>.*//'|sed 's/\t//'|sed 's/\ (0x.*//'|grep --color=never /
这是有效的,因为只有具有硬编码路径的库的名称中通常含有斜杠。它让您知道在进行下一种可能性时应该寻找什么。
编辑2
您可以使用LD_PRELOAD
和/或LD_LIBRARY_PATH
从手动指定的库加载符号,从而消除下面提到的“硬编码路径”问题。
如果您的库有硬编码的路径,我听说有一个名为 的工具chrpath
可以更改运行路径。我在十六进制编辑器中简单地打开二进制文件并更改共享库的路径(只要它们比最初编译的路径短)就取得了(有限的)成功。它们必须以字符串终止符结尾。 (在 C 语言中这几乎总是00
)。为了确保您有足够的空间来更改路径,我会(在我编译它的系统上)将前缀设置为带有符号链接的长得可笑的东西,如果您的库位于/usr/lib
:
sudo mkdir /OH_THIS_IS_A_VERY_VERY_VERY_VERY_VERY_LONG_DIRECTORY_NAME/
sudo ln -s /usr/lib /OH_THIS_IS_A_VERY_VERY_VERY_VERY_VERY_LONG_DIRECTORY_NAME/lib
mkdir destdir
./configure --prefix=/OH_THIS_IS_A_VERY_VERY_VERY_VERY_VERY_LONG_DIRECTORY_NAME
make
make install DESTDIR=$PWD/DESTDIR
($PWD
顺便说一句,是当前目录。)
这将为您提供足够的空间来更改路径。如果实际路径后还有剩余空间,您可以继续添加,00
直到到达通常空间的末尾。我只需要使用为 Android 手机编译的二进制文件来实现这一点,该手机ncurses
的路径已硬编码到二进制文件中。
我刚刚发现的最后一件事:您可以通过添加此内容来使位置ld-linux.so.*
不被硬编码(适应您的系统位置,运行类似的命令locate ld-linux
并找到类似于以下内容的位置:
-Wl,--dynamic-linker=/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
到你的LDFLAGS
变量。
答案2
我遇到了和你一样的问题(带有一些“安全化”的Linux)。我在同一个 Linux 操作系统(所有/usr/share/emacs
树/usr/libexec
和所有文件)上执行了一个已安装的版本,/usr/bin/emacs*
并将其放在安全机器上。
运行后emacs24-x
,它要求一个共享库(.so
)我不记得是哪个......
我还在目标计算机上携带了它,并将emacs24-x
调用(使用函数参数"$@"
)封装在一个函数中,该函数添加了变量.so
中的位置LD_LIBRARY_PATH
(用 包围()
以避免累积)。
/usr/share
然后,我收到了上面列出的有关地点的消息libexec
。
我已经修改了可执行文件中的所有引用,使用二进制编辑器(例如/usr/share/emacs
)和复制树中的十几个 ASCII 文件,将每个“/usr/share”替换为“/tmp/share”和) 。/usr/libexec
madedit
/tmp/libexec
在我的“emacs”函数中,我添加了mkdir /tmp/share
和 两个符号链接(测试后它们还不存在)以连接到复制的 emacs 树。
之后,运行
emacs <myfile>
非常适合我。我有一个真正的便携式 Emacs 版本(没有配置它)。
答案3
我能够在 CentOS 7 上制作 Emacs 24 的便携式版本。同样的方法应该适用于 Debian。我做的第一件事是安装一个带有全新操作系统副本的虚拟机,以确保我拥有 root 权限并可以安装任何所需的库和工具。
我最初尝试创建便携式安装,涉及emacs
在虚拟机上安装包并将二进制文件和库复制到自定义文件夹中,然后设置LD_LIBRARY_PATH
为包含库的文件夹。这足以让 Emacs 在目标系统上启动,但不幸的是,Emacs 似乎对其某些配置设置使用硬编码值,并且我无法找到解决以下有关缺少字符集目录的错误的方法:
Warning: arch-dependent data dir (/usr/libexec/emacs/24.3/x86_64-redhat-linux-gnu/) does not exist.
Warning: arch-independent data dir (/usr/share/emacs/24.3/etc/) does not exist.
Warning: Lisp directory `/usr/share/emacs/24.3/lisp' does not exist.
Warning: Lisp directory `/usr/share/emacs/24.3/leim' does not exist.
Error: charsets directory not found:
/usr/share/emacs/24.3/etc/charsets
Emacs will not function correctly without the character map files.
Please check your installation!
我无权在/usr/share
目标系统上创建链接或文件夹,因此这阻止了我的进度。
我的第二次尝试是将 Emacs 的源代码(超过一演出!)下载到虚拟机中,并使用该./configure --prefix=<DIR>
命令构建我自己的副本。我在以下位置找到了获取和构建 Emacs 的说明:http://ergoemacs.org/emacs/building_emacs_from_git_repository.html,它使用 Debian 命令。我的工作流程是:
git clone https://github.com/mirrors/emacs.git
cd emacs
git pull
./autogen.sh
# Here, I tell make to install emacs to ~/bin/centos
./configure --prefix=~/bin/centos
make bootstrap
make install
我确实不得不绕一些弯路来安装特定于 CentOS 的库依赖项 ( sudo yum install texinfo ncurses-devel.x86_64
)。
现在我可以将我的~/bin/centos
文件夹(其中包含运行 Emacs 所需的所有二进制文件和库)复制到其他 CentOS 7 系统上的同一位置,添加~/bin/centos/bin
到我的PATH
,Emacs 就可以运行了。我确实必须复制我的.emacs
文件和.emacs.d
文件夹以保留我的设置和主题。它基本上是一个独立的、可移植的 Emacs 安装,位于我的主目录中,在我没有权限安装系统 Emacs 软件包的系统上。
如果您为该configure
命令提供 USB 驱动器上的一个文件夹(例如./configure --prefix=/media/usb/bin
)并始终将 USB 驱动器安装在同一位置,则您应该能够仅安装 USB 驱动器、设置PATH
变量并运行 Emacs。似乎没有办法在调用自身时指定自定义.emacs
文件或文件夹,但您可以仅使用to或类似的符号链接。.emacs.d
emacs
~/.emacs
/media/usb/.emacs