Arn*_*rne 7 compiling debian emacs portability shared-library
我想制作 Emacs 24.3 的“便携式”版本。我正在使用一些 Debian 7 系统,但我没有 root 访问权限。由于 Debian 7 缺少 Emacs 24,我想构建它的便携版本,我可以用 U 盘随身携带。我的具体问题是:
configure --prefix=...?.so文件与安装捆绑在一起?我有几种方法可以做到这一点,首先是简单的方法:
使安装前缀灵活很困难 - 我只需将安装前缀设置为您的主目录,或者您可以在任何计算机上访问的某个位置,然后使用
make install DESTDIR=/path/to/place/where/binaries/should/be/installed
Run Code Online (Sandbox Code Playgroud)
将它们安装到前缀以外的位置。
我个人将二进制文件放在 中$HOME/bin,所以我的命令如下所示:
./configure --prefix=$HOME
Run Code Online (Sandbox Code Playgroud)
有些程序(我知道 FFmpeg 就是其中之一)可以使用编译到程序中的所有库来构建,从而避免共享库。在 ffmpeg 的情况下(也可能是其他情况),配置标志是--disable-shared --enable-static.
您可以用来ldd (name-of-binary-file)检查它需要哪些共享对象,并将它们复制到您的闪存驱动器。
我刚刚找到了一种方法来仅获取所链接的库的名称,这非常有帮助。
ldd binary-name|sed 's/=>.*//'|sed 's/\t//'|sed 's/\ (0x.*//'
Run Code Online (Sandbox Code Playgroud)
将获得链接到的所有库的列表。
此外,这只会为您提供具有硬编码路径的文件:
ldd binary-name|sed 's/=>.*//'|sed 's/\t//'|sed 's/\ (0x.*//'|grep --color=never /
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为只有具有硬编码路径的库的名称中通常含有斜杠。它让您知道在进行下一种可能性时应该寻找什么。
您可以使用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
Run Code Online (Sandbox Code Playgroud)
($PWD顺便说一句,是当前目录。)
这将为您提供足够的空间来更改路径。如果实际路径后还有剩余空间,您可以继续添加,00直到到达通常空间的末尾。我只需要使用为 Android 手机编译的二进制文件来实现这一点,该手机ncurses的路径已硬编码到二进制文件中。
我刚刚发现的最后一件事:您可以通过添加此内容来使位置ld-linux.so.*不被硬编码(适应您的系统位置,运行类似的命令locate ld-linux并找到类似于以下内容的位置:
-Wl,--dynamic-linker=/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
Run Code Online (Sandbox Code Playgroud)
到你的LDFLAGS变量。
| 归档时间: |
|
| 查看次数: |
4906 次 |
| 最近记录: |