【发布时间】:2020-07-28 23:15:01
【问题描述】:
我正在 CMake 中构建一个库,该库在私有标头中有一些常量。当我在Release 配置中编译时,例如-O3 -DNDEBUG 并在输出上运行strings,这些常量出现在输出中。这些常量的名称揭示了一些我希望尽可能隐藏的实现细节。
这是一个演示问题的最小项目示例:
private.h
#pragma once
const int MY_CONSTANT = 42;
lib.c
#include "private.h"
extern int get_mask(void)
{
return MY_CONSTANT ^ 3;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(dummylib)
add_library(mylib SHARED lib.c)
构建并显示字符串输出:
$ mkdir build && cd build && cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build . --config Release -- VERBOSE=1 && strings libmylib.so | grep MY
MY_CONSTANT
是否有一些额外的开关可以用来隐藏这些信息?
【问题讨论】:
-
尽管有名字,但这不是一个常数。没有
static关键字,它是一个全局变量。使用static关键字,它是一个文件范围变量。无论哪种方式,它都是一个变量。如果您想要一个名称不会出现在输出文件中的常量,请使用#define。 -
我更正了 const 错误,实际库中所有这些都有
const关键字。 -
@Mat 似乎 CMake
Release构建类型隐式处理了这个问题,但无论如何我一定会添加它!谢谢!
标签: c linux shared-libraries obfuscation elf