将文件列表附加到二进制
Append List of FilesTo Binary
有没有办法将文件列表作为可执行文件附加到文件本身,以便文件仍然可执行?
例如,假设我有 2 个文件 file1 和 file2。我如何以某种方式将文件附加到二进制文件。这又是一个简单的例子,我希望有一种跨操作系统的方式来提取 Unix 和 Windows 文件。将 zips(或 tar.gz)附加到文件的跨操作系统方式只是稍后解压缩。
下面说明了如何提取和/或创建文件。
create ./a.exe ./output.exe file1 file2
extract output.exe
反对者请留言
copy /b test.exe+test.txt testwithtext.exe
cp /bin/ls test;cat /etc/hosts >> trst
- 写一个程序读取源代码文件
- 编写它以将换行符转换为转义字符并处理引号和其他此类字符
- 将其写为输出为字符数组嵌入到源代码中的适当位置并作为新文件写出。
- 配置您的 maker/builder 以调用重写程序来创建新文件,然后从新文件编译和构建。
注意:这不满足代码为 "appended" 的严格要求,也不满足代码为 "as-is" 且未转义的(可能但未说明的)要求。
一定要C吗?问题文本没有说明语言,尽管标签暗示了它。
如果它是 Java,您只需构建一个 jar,其中包含 "executable" 和源作为 jar 中的两个文件,它本身是可执行的。
在 Linux 和(对可执行文件使用 ELF 文件格式)和 Mac OS X(使用 Mach-O)和其他一些系统上,您可以简单地将数据附加到可执行文件,它仍然会 运行。例如:
cp /bin/ls foo
cat /etc/hosts >> foo
./foo
这将 运行 与 ls
一样,但文件末尾还包含一个文本文件。
原则上,您可以通过将源代码附加为二进制文件中额外未使用的部分来完成此操作。例如,在 Linux(或其他使用 GNU binutils 的 ELF 系统)上,我们可以将其嵌入 source
部分:
objcopy yes --add-section source=yes.c yes
并提取它:
objcopy yes --only-section source --set-section-flags source=alloc -O binary yes.c
类似地,在 Mac OS X 上,我们可以将一些额外的选项传递给链接器以让它创建该部分:
gcc -Wl,-sectcreate,source,yes.c,yes.c yes.c -o yes
(请注意,源文件名在链接器选项中出现两次;这不是拼写错误!Mach-O 可执行文件中的部分同时具有段名和部分名;我正在使用文件名作为此处的部分名称。)
并提取它:
otool -s source yes.c -X yes
(不幸的是,这给出了十六进制转储的输出,而不是原始数据。您必须稍微修改一下才能将其恢复为文本。)
话虽如此,这一切都非常愚蠢。 不要将此用作分发源代码的严肃方法。将源代码嵌入可执行文件是聚会的把戏,不是有用的技术。
一个可能的解决方案是创建一个可执行文件,该文件将接受按顺序 运行 的可执行文件路径列表。
例如:运行all /home/a.exe /home/output.exe
只需将它们打包成一个拉链即可。 ZIP 是一个跨平台容器,可以包含多个文件。
这确实是您问题的最佳解决方案。
您还可以使用 self extracting archive 使用一些存档工具,例如 7-zip。这是在另一个可执行文件中获取两个可执行文件的最快方法。
有没有办法将文件列表作为可执行文件附加到文件本身,以便文件仍然可执行?
例如,假设我有 2 个文件 file1 和 file2。我如何以某种方式将文件附加到二进制文件。这又是一个简单的例子,我希望有一种跨操作系统的方式来提取 Unix 和 Windows 文件。将 zips(或 tar.gz)附加到文件的跨操作系统方式只是稍后解压缩。
下面说明了如何提取和/或创建文件。
create ./a.exe ./output.exe file1 file2
extract output.exe
反对者请留言
copy /b test.exe+test.txt testwithtext.exe
cp /bin/ls test;cat /etc/hosts >> trst
- 写一个程序读取源代码文件
- 编写它以将换行符转换为转义字符并处理引号和其他此类字符
- 将其写为输出为字符数组嵌入到源代码中的适当位置并作为新文件写出。
- 配置您的 maker/builder 以调用重写程序来创建新文件,然后从新文件编译和构建。
注意:这不满足代码为 "appended" 的严格要求,也不满足代码为 "as-is" 且未转义的(可能但未说明的)要求。
一定要C吗?问题文本没有说明语言,尽管标签暗示了它。
如果它是 Java,您只需构建一个 jar,其中包含 "executable" 和源作为 jar 中的两个文件,它本身是可执行的。
在 Linux 和(对可执行文件使用 ELF 文件格式)和 Mac OS X(使用 Mach-O)和其他一些系统上,您可以简单地将数据附加到可执行文件,它仍然会 运行。例如:
cp /bin/ls foo
cat /etc/hosts >> foo
./foo
这将 运行 与 ls
一样,但文件末尾还包含一个文本文件。
原则上,您可以通过将源代码附加为二进制文件中额外未使用的部分来完成此操作。例如,在 Linux(或其他使用 GNU binutils 的 ELF 系统)上,我们可以将其嵌入 source
部分:
objcopy yes --add-section source=yes.c yes
并提取它:
objcopy yes --only-section source --set-section-flags source=alloc -O binary yes.c
类似地,在 Mac OS X 上,我们可以将一些额外的选项传递给链接器以让它创建该部分:
gcc -Wl,-sectcreate,source,yes.c,yes.c yes.c -o yes
(请注意,源文件名在链接器选项中出现两次;这不是拼写错误!Mach-O 可执行文件中的部分同时具有段名和部分名;我正在使用文件名作为此处的部分名称。)
并提取它:
otool -s source yes.c -X yes
(不幸的是,这给出了十六进制转储的输出,而不是原始数据。您必须稍微修改一下才能将其恢复为文本。)
话虽如此,这一切都非常愚蠢。 不要将此用作分发源代码的严肃方法。将源代码嵌入可执行文件是聚会的把戏,不是有用的技术。
一个可能的解决方案是创建一个可执行文件,该文件将接受按顺序 运行 的可执行文件路径列表。
例如:运行all /home/a.exe /home/output.exe
只需将它们打包成一个拉链即可。 ZIP 是一个跨平台容器,可以包含多个文件。
这确实是您问题的最佳解决方案。
您还可以使用 self extracting archive 使用一些存档工具,例如 7-zip。这是在另一个可执行文件中获取两个可执行文件的最快方法。