【问题标题】:Compiling library version into .so file将库版本编译成 .so 文件
【发布时间】:2015-01-13 16:40:55
【问题描述】:

我有一个 C linux API 库,我将它分发给最终用户和服务器。当用户需要使用这个库时,他们会编译并构建一个 .so 文件,然后将其发送到我们的服务器以运行。我想要一种将库的版本号编译到他们的 .so 文件中的方法,以便我的服务器可以检查他们编译的版本。这样,如果服务器与用户的 .so 文件不兼容,我可以拒绝加载库。我不确定我什至必须有哪些选择才能实现这一目标,并希望得到任何类型的建议。如果有更多信息有助于解决此问题,请告诉我。

【问题讨论】:

    标签: c gcc versioning shared-libraries


    【解决方案1】:

    库通常有一个getLibraryVersion 函数,它返回一些常量值,可以是字符串、整数或其他任何值。这将为您提供您链接的版本(即您的 .so 版本)。你可以有一个额外的宏来获取你编译的版本(即你的服务器的版本)。

    例如,SDL 的 API 有一个版本结构,并在其标头之一中定义了以下函数:

    #define SDL_MAJOR_VERSION   1
    #define SDL_MINOR_VERSION   2
    #define SDL_PATCHLEVEL      15
    
    typedef struct SDL_version {
        Uint8 major;
        Uint8 minor;
        Uint8 patch;
    } SDL_version;
    
    /**
     * This macro can be used to fill a version structure with the compile-time
     * version of the SDL library.
     */
    #define SDL_VERSION(X)              \
    {                                   \
        (X)->major = SDL_MAJOR_VERSION; \
        (X)->minor = SDL_MINOR_VERSION; \
        (X)->patch = SDL_PATCHLEVEL;    \
    }
    
    /**
     * Use this function to get the version of SDL that is linked against
     * your program.
     */
    extern void SDL_GetVersion(SDL_version* ver);
    

    在您的.so.c 文件之一中:

    void SDL_GetVersion(SDL_version* ver)
    {
        SDL_VERSION(ver);
    }
    

    使用示例:

    SDL_version compiled;
    SDL_version linked;
    
    SDL_VERSION(&compiled);
    SDL_GetVersion(&linked);
    
    printf("We compiled against SDL version %d.%d.%d ...\n",
       compiled.major, compiled.minor, compiled.patch);
    printf("We are linking against SDL version %d.%d.%d.\n",
           linked.major, linked.minor, linked.patch);
    

    附带说明;在你的服务器上运行别人的代码有点危险。

    【讨论】:

    • 我同意,我们确实使用了一些 linux 监禁,并且正在研究容器和其他可能的选项。但是如果库有这个功能,那它怎么会被过滤到用户代码中呢?当我的服务器调用 getLibraryVersion 时,它只会检查服务器上自己的版本,而不是 .so 编译的版本?还是我不明白
    • 我已经用一个例子更新了我的答案。我不完全确定您如何使用传递到您的服务器的 .so,因此如果这对您不起作用,您可能需要详细说明:)
    • 我现在正在查看您的代码,非常感谢您迄今为止的帮助。
    猜你喜欢
    • 2016-09-27
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    相关资源
    最近更新 更多