我编译以下程序gcc并接收输出可执行文件a.out.:
#include <stdio.h>
int main () {
printf("hello, world\n");
}
Run Code Online (Sandbox Code Playgroud)
当我执行时cat a.out,为什么文件是"乱码"(这叫什么?)而不是0和1的机器语言:
??????? H__PAGEZERO(__TEXT__text__TEXT?`??__stubs__TEXT
P__unwind_info__TEXT]P]__eh_frame__TEXT?H??__DATA__program_vars [continued]
Run Code Online (Sandbox Code Playgroud) 假设有一个 C++ 代码,我使用以下命令编译成可执行文件:
g++ test.cpp -o testcpp
Run Code Online (Sandbox Code Playgroud)
我可以使用终端运行它(我使用的是 OS X),并提供一个用于在 C++ 程序内部处理的输入文件,例如:
./testcpp < input.txt
Run Code Online (Sandbox Code Playgroud)
我想知道从Haskell内部这样做是否可行。我听说过模块中的readProcess函数System.Process。但这仅允许运行系统 shell 命令。
这样做:
out <- readProcess "testcpp" [] "test.in"
Run Code Online (Sandbox Code Playgroud)
或者:
out <- readProcess "testcpp < test.in" [] ""
Run Code Online (Sandbox Code Playgroud)
或者:
out <- readProcess "./testcpp < test.in" [] ""
Run Code Online (Sandbox Code Playgroud)
抛出此错误(或非常相似的错误,具体取决于我使用的是上述哪一个):
testcpp: readProcess: runInteractiveProcess: exec: does not exist (No such file or directory)
Run Code Online (Sandbox Code Playgroud)
所以我的问题是,Haskell 是否可以这样做。如果是这样,我应该如何使用以及使用哪些模块/功能?谢谢。
编辑
好的,正如大卫建议的那样,我删除了输入参数并尝试运行它。这样做有效:
out <- readProcess "./testcpp" [] ""
Run Code Online (Sandbox Code Playgroud)
但我仍然坚持提供输入。
我有一个小的 powershell 脚本,它允许我快速为自己设置警报。它基本上只是等待指定的分钟数然后调用
味精 * 警报!
这很有效 - 弹出一个消息框。唯一的问题是它会在一段时间后消失 - 所以如果我不在办公桌前,我会错过消息框。
根据此处找到的文档,这是我未指定时间值时的行为。
/time: seconds :指定您发送的消息在用户屏幕上显示的时间。一旦达到时间限制,消息就会消失。如果未设置时间限制,则该消息将保留在用户的屏幕上,直到用户看到该消息并单击“确定”。
然而事实并非如此,它确实消失了。现在,我必须指定一个任意高的数字才能保留。
msg * /time:999999 alarm!
Run Code Online (Sandbox Code Playgroud) 这是我得到的一些信息program_invocation_name:
<.bss>or中<.data>。stack内存区域中。这很奇怪......)这是调试器视图program_invocation_name:
pwndbg> x/s program_invocation_name
0xbffff302: "/tmp/my_program"
Run Code Online (Sandbox Code Playgroud)
问题)
我从程序开始到结束都遵循执行流程,但我找不到设置的那一刻。program_invocation_name
问题)
Q1 . 谁(什么函数)设置了这个值?(loader设置这个值..?)
Q2。global variable尽管该值位于 ? 中,但程序如何知道将其识别为stack?
Q3 . 有时,某些二进制文件运行时没有此值。在这种情况下,问题是loader?
背景
我有一个名为 mason_simulator 的 Unix 可执行文件。我通过以下方式在 macOS 终端中检查了它的属性
file mason_simulator
Run Code Online (Sandbox Code Playgroud)
结果如下:
mason_simulator: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=f020e84c15ef18a541d6bce9376f58fe3e547448, not stripped
Run Code Online (Sandbox Code Playgroud)
问题 这是否意味着无法在 macOS 中执行此文件?因为当我双击它时,会出现错误消息:“无法执行二进制文件”。
我有一个 Linux 虚拟机。有一些信息。
uname -a:
Linux 05d57a817610 4.4.0-131-generic #157-Ubuntu SMP Thu Jul 12 15:51:36 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
cat /proc/version: Linux version 4.4.0-131-generic (buildd@lgw01-amd64-015) (gcc version 5.4.0 20160609 (Ubuntu 5.4.0-6ubuntu1~16.04.10) ) #157-Ubuntu SMP Thu Jul 12 15:51:36 UTC 2018
cat /etc/issue: Ubuntu 18.04.2 LTS \n \l
/*abc.c*/
#include<stdio.h>
int main(){
printf("Hello World\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我使用了命令gcc abc.c -o abc.o,然后我得到了一个文件:abc.o. 它是可执行的。
当我使用命令时:gcc abc.c -c,它生成了一个文件abc.o. 然后我尝试使用命令:./abc.o,但它显示bash: …
在我的 FASM 项目(对象)中,我尝试创建一个跳转表并用于dq每个跳转地址,但有一个问题!
对于每个dq .jmp1(跳转地址定义),.jmp1我的最终 .o 文件的总大小将添加 24 个字节(加上地址的 8 个字节(总共 32 个字节))!
那额外的 24 个字节是什么?有什么办法可以避免吗?这种情况仅发生在目标文件中,而不发生在可执行文件中!
它定义了 32 个字节,而不是每个跳转地址 8 个字节!问题是什么?
format ELF64
section '.text'
func:
lea rax, [8*rax+.jmp_table]
.jmp1:
.jmp_table:
dq .jmp1 ; 8 bytes + 24 bytes !!! (to .o total size)
dq .jmp1 ; 8 bytes + 24 bytes !!! (to .o total size)
Run Code Online (Sandbox Code Playgroud)
但是当我创建一个可执行文件时,每个文件dq只需要 8 个字节(这是我所期望的)......
format ELF64 EXECUTABLE
segment readable executable
func:
lea rax, [8*rax+.jmp_table]
.jmp1:
.jmp_table: …Run Code Online (Sandbox Code Playgroud) c ++的可执行文件将包含链接器,模块和其他,我想查看其内容,我正在使用linux,我如何查看a.out的内容?哪个命令应该用来浏览a.out,文本编辑器不会显示内容......
我制作了一个可执行文件,我想将任意数量的文件拖到其中。我希望它删除所有这些文件的前 15 个字符。它正在按预期重命名大量文件,但随后会引发错误。
“未处理的异常:System.IndexOutOfRangeException:索引超出数组范围。在 RemoveTimeStampMultipleFiles.Program.Main(String[] args)”
当我拖动 2 个文件时,它是否在寻找第三个文件?
还有一种方法可以允许无限文件而不是最多 99 个文件吗?
using System;
using System.IO;
namespace RenameVersion2
{
class Program
{
static void Main(string[] args)
{
if (args.Length == 0)
return; // return if no file was dragged onto exe
for (int i = 0; i < 99; i++)
{
if (args[i].Length == 0)
System.Environment.Exit(0);
string MyString = Path.GetFileNameWithoutExtension(args[i]);
String NewFileName = MyString.Remove(0, 15);
string path = Path.GetDirectoryName(args[i])
+ Path.DirectorySeparatorChar
+ MyString
+ Path.GetExtension(args[i]);
string newPath = Path.GetDirectoryName(args[i])
+ …Run Code Online (Sandbox Code Playgroud) 是否有任何网站允许我上传我的源代码,它会返回我可以从Linux运行的二进制文件?
我在使用Linux时非常苛刻,这种服务对我来说将是一种救命.
我知道codepad.org但据我所知,它只输出这些程序的文本.我需要下载它在编译时生成的可执行文件.