我有一些 .c .h 文件,其主要功能封装在MAIN_FUNC.c中。我需要将它们传递给一个将MAIN_FUNC()与他的文件集成在一起的人。

但是,由于我的算法是保密的,因此我不能仅发送 .c .h 文件,因此我一直在研究静态和共享库。但是我仍然有一些疑问。

1:在我看到的每个教程中,也都需要 .h 。我有什么办法可以给这个家伙发送一个他可以在其代码中#include的单个库文件?

2:即使我必须传递 .h 的文件,我是否真的需要全部传递?我怎样才能只给他libMAIN_FUNC.a和MAIN_FUNC.h?

3:使用 .a .so 库,可以通过任何方式对文件进行反向工程,以便可以看到 .c .h 代码?

最佳答案

首先,关于逆向工程。给定无限的时间和资源,您的代码始终可以进行逆向工程。话虽如此,您的目标是使他人​​无法对代码进行反向工程。

现在回答您的问题:
从c代码生成可执行二进制文件的过程分为两个主要步骤。编译和链接。
编译后,您的files.c成为目标文件(机器代码)。它们尚未可执行。

如果您有两个文件:file1.c和file2.c,则将得到例如file1.o和file2.o。

现在,file1.c中的代码可能正在调用存在于file2.o中的函数。在编译阶段,file1.c需要知道的只是函数原型(prototype)。

当调用链接器以生成可执行二进制文件时,它确保从file1.o调用的函数存在于某处,例如在file2.o中。

这对您有何影响:

头文件不应是专有的(但可能是出于法律原因)。头文件主要用于告诉其他.c文件期望什么功能和返回值(声明,而不是实现)。

现在,无论出于何种原因,您都可能拥有一些专有的函数原型(prototype),而这些原型(prototype)都不希望向世人展示。假设您希望世界通过调用该函数来启动代码

start_magic();

然后,您要做的是:
  • 提供头文件:magic.h包含在main.c中
  • 头文件将具有以下功能:void start_magic();
  • 然后将您的专有代码放入algo.c和algo.h中
  • algo.c将具有start_magic()实现
  • algo.c将包括专有的algo.h

  • 现在您可以做的是编译(不链接)您的algo.c文件,并去除调试符号,以使其难以进行反向工程。如何完成此操作取决于您使用的编译器。

    现在,您可以向想要调用函数start_magic()的人员提供目标文件和头文件。

    main的实现者必须使用您提供的目标文件来链接程序。

    示例

    假设您的算法中有algo.c。假设algo.c具有以下功能:
    float sqrt(float x){
        taylor_approx(x);
    }
    

    假设sqrt功能将与供应商共享。但是,sqrt函数调用专有函数taylor_approx(x)来计算平方根。

    您可以创建一个algo.h文件发送给用户,其中包含:
    extern float sqrt(float x);
    

    然后,您可以从调试符号中剥离下来的已编译目标文件(例如algo.o)发送给用户,并要求他们将algo.h放入其main.c中。

    请注意,这是一种方法。

    关于c - 有关静态和共享库的C问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38017302/

    10-11 15:45