Restricting symbols in a Linux static library

后端 未结 5 749
逝去的感伤
逝去的感伤 2020-12-02 11:40

I\'m looking for ways to restrict the number of C symbols exported to a Linux static library (archive). I\'d like to limit these to only those symbols that are part of the

5条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-02 12:18

    This is a refinement of the answers from EmployedRussian and JonChesterfield, which may be helpful if you're generating both dynamic and static libraries.

    Start with the standard mechanism for hiding symbols in DSOs (the dynamic version of your lib). Compile all files with -fvisibility=hidden. In the header file which defines your API, change the declarations of the classes and functions you want to make public:

       #define DLL_PUBLIC __attribute__ ((visibility ("default")))
       extern DLL_PUBLIC int my_api_func(int);
    

    See here for details. This works for both C and C++. This is sufficient for DSOs, but you'll need to add these build steps for static libraries:

    ld -r obj1.o obj2.o ... objn.o -o static1.o
    objcopy --localize-hidden static1.o static2.o
    ar -rcs mylib.a static2.o
    

    The ar step is optional - you can just link against static2.o.

提交回复
热议问题