代码之家  ›  专栏  ›  技术社区  ›  ImgPrcSng

静态库中的符号可见性和操纵

  •  1
  • ImgPrcSng  · 技术社区  · 6 年前

    我试图用源文件创建一个静态库。为了说明我面临的问题,让我们考虑以下代码片段:

    foo.h :

    void public_fn_exposed_to_client();
    

    foo.cpp :

    #include "foo.h"
    #include <iostream>
    #define EXPORT __attribute__ ((visibility ("default")))
    
    static void private_fn() {
        std::cout << "Hello private world" << std::endl;
    }
    
    // Can't declare static as this can be used elsewhere in my lib.
    // I tried to make this symbol hidden.
    
    void internal_fn_used_inside_lib(){
        std::cout << "Hello Internal Wolrd" << std::endl;
    
    }
    
    EXPORT
    void public_fn_exposed_to_client()
    { 
        std::cout << "Hello Outside World" << std::endl;
        internal_fn_used_inside_lib(); 
    }
    

    main.cpp (通常由客户撰写):

    #include "foo.h"
    int main(int argc, char** argv)
    {
         // This is all good.
         public_fn_exposed_to_client();
    }
    

    main2.cpp (通常由客户撰写):

    #include "foo.h"
    extern void internal_fn_used_inside_lib();
    int main(int argc, char** argv)
    {
        // Ideally, This should not be allowed
        internal_fn_used_inside_lib();
    }
    

    汇编:

    g++ -o foo.o foo.c -fvisibility=hidden
    ar rcs libfoo.a foo.o
    ranlib libfoo.a
    
    g++ -o main1 main.cpp -L. -lfoo
    g++ -o main2 main2.cpp -L. -lfoo
    

    我想实现main2不被编译/链接的情况。这是为了阻止我的库的客户端使用未公开为API的低级函数。

    特别是,如何处理不能声明为静态的函数?

    我尝试过的事情:

    • 如中所述 this ,我尝试使用带有本地化隐藏标志的objcopy,但没有任何东西阻止客户端再次全球化,对吗?

    • 导出地图-我不知道如何使它们与静态存档一起工作。相反,我不知道它们是否适用。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Mike Kinghan Luchian Grigore    6 年前

    不可能。静态库可以看作是所有未链接对象文件的单个文件归档。因此,链接对象文件的可见内容在整个静态库中是可见的。

    “隐藏”东西的唯一方法是不提供头文件,但没有任何东西可以阻止用户自己重新创建这些头文件。