我想创建一个OpenCL内核,而不向最终用户提供访问权限。
因此,我无法使用常规的外部.cl
文本文件。有什么选择,关于我想避免用内核创建一个巨大的文本字符串?
还有一个问题,如果我把这段代码放在一个硬编码的字符串中,是否可以从一些反汇编程序中访问该代码?
答案 0 :(得分:1)
这里有2个场景:
在第一种情况下,可以将二进制数据嵌入到可执行文件中(使用字符串)。并在运行程序时加载它。 没有可能的逆向工程(除非已经知道的那些,比如汇编),因为程序将编译代码而不是你编写的原始代码。
这样做的方法是:
uchar binary_dev1[binarySize] = "..."
uchar * binary = &binary_dev1;
program = clCreateProgramWithBinary(context, 1, &device,
&binarySize,
(const unsigned char**)&binary,
&binaryStatus,
&errNum);
第二种方法是通过某种方式保护内核中的源代码" mangling"。 由于将编译mangler代码,因此逆向工程可能很复杂。
你可以做任何你可以想到的可逆的修正,甚至可以将它们结合起来。一些想法:
使用压缩格式压缩代码,但硬编码解压缩的一些参数,使其不那么简单。
在代码上使用XOR运算符。如果它随时间变化会更好,如果它使用非显而易见的规则变化则更好。
char seq = 0x1A; for(int i=0; i<len; i++){ out[i] = in[i] ^ seq; seq = ((seq ^ i) * 78965213) >> 4 + ((seq * i) * 56987) << 4; }
使用需要密钥的编码方法对其进行编码,并且是可逆的
答案 1 :(得分:1)
对OpenCL 2.0使用SPIR 1.2,对OpenCL 2.0使用SPIR 2.0,直到OpenCL 2.1的SPIR-V可用。