MacO 10.6,如果我有一个文件"unwanted.c",其中包含:
class secret_thing {
public:
secret_thing() {}
void revealing_method_name() {}
};
main()
{
secret_thing obj;
obj.revealing_method_name();
}
Run Code Online (Sandbox Code Playgroud)
现在我做:
$ g++ unwanted.c -o unwanted
$ strip unwanted
$ nm unwanted | grep secret
0000000100000eb8 T __ZN12secret_thing21revealing_method_nameEv
0000000100000eae T __ZN12secret_thingC1Ev
Run Code Online (Sandbox Code Playgroud)
如果我分离出秘密类的接口和实现,就像大多数人在编写C++代码时那样,那么剥离的可执行文件中就没有不需要的符号.可悲的是,我交给了现有数千行代码的代码库,这不是我的选择之一.
我试过-fno-rtti,作为一个疯狂的猜测,并没有解决任何问题.我已经向谷歌众神祈祷并发现许多对脱衣舞俱乐部的引用,但没有任何有用的链接.我已经在mac上浏览了strip,g ++和ld的手册页,并且没有明显的尝试,尽管"私人外部"一词很有趣,我无法弄清楚该怎么做.
[更新]可悲的是,我试图做一个小例子后出现问题.这是一个更复杂的例子,它更接近真正的问题,如果它是经过优化的,它仍然有不需要的符号.
我为坏的例子道歉.事实证明,很难找到最小的实际问题.非常感谢答案,但每个答案都让我接近解决方案.
class base {
public:
virtual int revealing_method_name() = 0;
virtual ~base() {};
};
class secret_thing : public base {
public:
int revealing_method_name() { return 0; };
};
class other_thing : public base {
public:
int revealing_method_name() …Run Code Online (Sandbox Code Playgroud) 我正在尝试创建一个用Objective-C编写的静态库.我想隐藏这个库的消费者的所有实现细节.在此示例中,"OneThing"对象使用库内部的其他功能,包括"SecretThing",它可能被库中的许多内容使用(并且不能隐藏在OneThing内部).但是我不希望库的用户看到OneThing使用SecretThing,或者甚至存在SecretThing,即使他们在.a文件中查找.
@interface OneThing
+ (void) do;
@end
@interface SecretThing
+ (void) undo;
@end
@implementation OneThing
+ (void) do
{
[SecretThing undo];
}
@end
@implementation SecretThing
+ (void) undo { }
@end
Run Code Online (Sandbox Code Playgroud)
如果我们编译它,并检查符号表:
% cc -c onething.m
% nm onething.o | grep Thing
0000000000000000 t +[OneThing do]
00000000000002f8 s +[OneThing do].eh
0000000000000040 t +[SecretThing undo]
0000000000000320 s +[SecretThing undo].eh
0000000000000078 S _OBJC_CLASS_$_OneThing
0000000000000050 S _OBJC_CLASS_$_SecretThing
00000000000000a0 S _OBJC_METACLASS_$_OneThing
00000000000000c8 S _OBJC_METACLASS_$_SecretThing
0000000000000128 s l_OBJC_$_CLASS_METHODS_OneThing
00000000000001d8 s l_OBJC_$_CLASS_METHODS_SecretThing
0000000000000190 s l_OBJC_CLASS_RO_$_OneThing
0000000000000240 …Run Code Online (Sandbox Code Playgroud) 背景:
我们目前正在使用 git 在我正在开发的 Web 应用程序中进行源代码管理。有一个编辑器,因此还有一个 git 的 Web 界面。
我们的用例之一是人们还可以从命令行管理他们的 git 存储库,因此 Web 界面需要能够以某种方式处理它发现存储库的任何奇怪状态。
题:
为了进行测试,获得一个包含所有可能状态的文件的 git 存储库会很棒,这样我就可以验证是否处理了所有可能的条件。阅读“man git-status(1)”时,我计算了一个文件可能存在的 24 个状态(不包括被忽略)。
我只知道如何创建这些状态中的 17 个。
这是我不知道如何重现的状态的 XY 代码(请参阅git-status)。
D M deleted from index
C [ MD] copied in index
D D unmerged, both deleted
A U unmerged, added by us
U A unmerged, added by them
Run Code Online (Sandbox Code Playgroud)