小编mto*_*toy的帖子

如何在MacOs中真正剥离二进制文件

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)

binary macos executable darwin strip

8
推荐指数
1
解决办法
1万
查看次数

如何隐藏objective-c库中的对象

我正在尝试创建一个用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)

objective-c static-libraries

5
推荐指数
1
解决办法
2242
查看次数

我如何产生所有可能的 git-status?

背景:

我们目前正在使用 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)

github 上有一个带有 ruby​​ 脚本的要点,它创建了我已经知道如何重现的每个状态,我很想完成它。

git jgit

5
推荐指数
1
解决办法
367
查看次数

标签 统计

binary ×1

darwin ×1

executable ×1

git ×1

jgit ×1

macos ×1

objective-c ×1

static-libraries ×1

strip ×1