我有一些 .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();
然后,您要做的是:
现在您可以做的是编译(不链接)您的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/