繁体   English   中英

从二进制文件中删除Protobuf C ++编译路径字符串

[英]Remove protobuf c++ compiled path string from binary

当我编译使用Protobuf的c ++程序,然后在二进制文件上运行linux strings命令时,字符串之一是生成的cc文件的路径,包括我的主目录和所有内容。 显然,我想从二进制文件中删除我的主目录和其他个人信息。

该路径从何而来?如何防止其进入已编译的二进制文件?

该字符串来自嵌入式protobuf描述符,该描述符用于执行protobuf类型的动态自省。 本质上,描述符描述了整个.proto文件。 描述符本身以protobuf格式编码; 参见google / protobuf / descriptor.proto

现在,描述符通常不应包含绝对路径像你描述。 它确实希望包含“规范”路径-即原始文件相对于源代码根的路径名,或者换句话说,就是您要在该文件的import语句中编写的路径。 例如, descriptor.proto自己的规范路径为google/protobuf/descirptor.proto 要导入它,您可以import "google/protobuf/descriptor.proto";

描述符获取完整的绝对文件系统路径的原因是因为这是您传递给protoc的路径,并且没有传递-I标志来告诉protoc源树的根在哪里。 由于protoc无法确定源代码的根目录,因此它回退到文件系统根目录。

例如,假设您的.proto文件是/home/foo/myproj/src/frobber/baz.proto 假设此路径中的src目录是您的“源根目录”,这意味着您希望人们编写import "frobber/baz.proto"; 导入您的原始文件。 在这种情况下,您想像这样调用protoc

protoc -I/home/foo/myproj/src /home/foo/myproj/src/frobber/baz.proto

请注意,如果您从myproj目录运行命令,则可能根本不应该指定绝对路径:

protoc -Isrc src/frobber/baz.proto

此处的-I标志是源文件名的文本前缀非常重要。 protoc很笨,只知道如何比较字符串。 例如,它不知道当前目录是什么:

# DOES NOT WORK
cd /home/foo/myproj
protoc -I/home/foo/myproj/src src/frobber/baz.proto

并且它也不能规范化“ ..”:

# DOES NOT WORK: protoc doesn't collapse "xyz/../".
protoc -Isrc xyz/../src/frobber/baz.proto

但是,如果“ ..”一致,则可以,因为protoc仍然只关心前缀匹配:

# OK: Prefix is consistent.
protoc -Ixyz/../src xyz/../src/frobber/baz.proto

如果您不想使用描述符

您可以通过在.proto文件中放置以下行,以“精简模式”编译proto文件:

option optimize_for = LITE_RUNTIME;

在这种模式下,将根本不包含描述符。 此外,您可以链接到protobuf运行时库的“精简版”,该版本比常规版本小得多。 但是,许多有用的功能将被禁用。 整个反射界面将消失,所有依赖反射的东西也将消失。 例如,将删除TextFormat ,这是DebugString()方法用于将消息转换为文本以进行打印以进行调试的方法,因此调试将更加困难。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM