【问题标题】:relocation error & Linux sw distributing重定位错误和 Linux 软件分发
【发布时间】:2011-04-27 15:35:38
【问题描述】:

这是我的目标:我在 Linux 中开发软件,我需要在没有源代码的情况下分发它。这个想法是创建一个 zip 文件,其中包含运行可执行文件所需的所有项目。用户将下载 zip,解压缩,双击,软件将在任何基于 Linux 的机器上启动。出于我不打算解释的动机,我不能使用 deb/rpm/etc 或安装程序。

sw 有以下依赖:

  1. 一些库(由我自己编写,依赖于 OpenCV),用 g++ 编译,创建 .a 文件(即静态库)
  2. OpenCV,在共享库中,有几个依赖项

我使用 gcc 编译我的程序,并将其链接到:

$ gcc -o my_exe <*.o files> -L<path my_lib> -Wl,--rpath,\$$ORIGIN/lib -lm -lstdc++ -lmy_lib -lopencv

然后我做:

$ ldd my_exe

然后我复制 ./lib 中列出的所有库,然后创建 .zip。

我将 zip 复制到另一台机器上,ldd my_exe 列出的依赖项已满足并正确指向 ./lib 但是当我启动程序时,出现以下错误:

$ ./my_exe: relocation error: lib/libglib-2.0.so.0: symbol strncmp, version GLIBC_2.2.5 not defined in file libc.so.6 with link time reference

怎么了?我的错在哪里?

一些附加信息:

$ -bash-3.2$ nm -D lib/libc.so.6  |grep strncmp
0000000000083010 T strncmp
$ -bash-3.2$ strings lib/libc.so.6 |grep GLIBC_2.2
GLIBC_2.2.5
GLIBC_2.2.6

我使用的是 gcc 4.4.5,Ubuntu 内核为 2.6.35 SMP,64 位。我试的机器也是64bit SMP kernel 2.6。

【问题讨论】:

  • 您的错误语句具有 glib 2.0 版,而您的 strings 列出了 glib 2.2 版。这可能是罪魁祸首吗?
  • 在第二台机器上,我这样做: -bash-3.2$ ldd my_exe|grep glib libglib-2.0.so.0 => lib/libglib-2.0.so.0 (0x00007fc7d5f47000) -bash- 3.2$ strings lib/libglib-2.0.so.0|grep GLIB GLIBC_2.8 GLIBC_2.4 GLIBC_2.3 GLIBC_2.7 GLIBC_2.3.4 GLIBC_2.9 GLIBC_2.2.5 所以,似乎 GLIBC 存在。无论如何,在本地机器上程序都可以工作..

标签: linux deployment gcc g++ relocation


【解决方案1】:

您似乎重新发明了包管理器(用于 .deb、.rpm、...)正在做什么。你为什么不想做一个真正的包裹。它会让事情变得更简单、更健壮。

而且由于您使用 C++ 编写代码,因此您将很难制作出适用于不同版本的 libstdc++*.so 的东西

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-27
    • 1970-01-01
    • 2012-12-27
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多