小编Dan*_*der的帖子

编译独立的静态可执行文件

我正在尝试编译不使用动态加载程序的可执行文件(ELF文件).我构建了一个交叉编译器,它编译linux中的mips,用于我制作的模拟器上.我在编译hello.cpp文件(hello world program)时声明了标志-static-libgcc.显然这还不够.因为我的可执行文件中仍有一个段包含动态加载程序的名称/路径.我用什么标志来生成包含需要运行的所有内容的可执行文件?我需要重建我的交叉编译器吗?

c++ compiler-construction linker executable

34
推荐指数
2
解决办法
3万
查看次数

在Cygwin上安装Ant

我在查找如何在Cygwin上安装Ant时遇到了一些麻烦.我想用Ant来构建Nutch.我查看过一堆教程,但是找不到任何低级别的东西让我理解.我需要像......

  1. 下载ant,把它放在这里
  2. 打开Cygwin
  3. 输入"export ANT_HOME = ..."
  4. ...

有人可以帮我从这里出去吗?

ant cygwin install build

20
推荐指数
2
解决办法
3万
查看次数

使用Struct Stat()

我试图弄清楚如何使用stat()来捕获有关文件的信息.我需要的是能够打印有关文件的几个字段的信息.所以..

 #include <iostream>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 using namespace std;

 int main() {
     struct stat buf;
     stat("file",&buf);
               ...
     cout << st_dev << endl;
     cout << st_ino << endl;
     cout << st_mode << endl;
     cout << st_nlink << endl;
     cout << st_uid << endl;
     cout << st_gid << endl;
     cout << st_rdev << endl;
     cout << st_size << endl;
     cout << st_blksize << endl;
     cout << st_blocks << endl;
     cout << st_atime << endl;
     cout << st_mtime << endl; …
Run Code Online (Sandbox Code Playgroud)

c++ struct posix

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

解释readelf -S输出

我正在尝试将elf文件加载到我制作的MIPS模拟器中.我遇到的问题是我不太明白精灵部分标题偏移背后的含义.当我进行段转储时,段25-31和33-35在0x00000000处"开始",但是标题表明该段以某个值的偏移量开始(例如010190).同样在-S部分的开头,readelf声明头部在内存中以0x107b4开始.但是在-S中可以看到,最早的内存分配(因为段0为空)实际上位于偏移010210的段26中.有人可以解释这里发生了什么吗?我想静态地将所有这个文件分配到一个内存数组中.是否有一些关于抵消的假设阻止我这样做?为什么readelf说0x107b4是标题起点?

另外,.init在将PC放在readelf指定的"入口点"之前,我应该运行吗?

编辑:好的,所以,我做了一个可执行文件的十六进制转储,我现在意识到偏移是指实际elf文件中的位置(包含"地址"0 - 11d48的元素.)所以我现在的问题是. ..如何解决许多内存地址引用地址0x00000000的事实?它们当然有不同的偏移但现在我知道这是特定于文件的,它意味着有几个部分别名.我是否真的在内存寻址中使用偏移量?

第25部分:

  0x00000000 00474343 3a202847 4e552920 332e342e .GCC: (GNU) 3.4.
  0x00000010 35000047 43433a20 ...
Run Code Online (Sandbox Code Playgroud)

Readelf -S 输出:

  There are 36 section headers, starting at offset 0x107b4:
Run Code Online (Sandbox Code Playgroud)

章节标题:

  [Nr] Name              Type            Addr     Off    Size   ES Flg Lk Inf Al
  [ 0]                   NULL            00000000 000000 000000 00      0   0  0
  [ 1] .interp           PROGBITS        00400134 000134 00000d 00   A  0   0  1
  [ 2] .note.ABI-tag     NOTE            00400144 000144 000020 00   A  0   0  4
  [ …
Run Code Online (Sandbox Code Playgroud)

linker compilation elf readelf

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

如何访问打开文件的文件描述符

有没有办法访问用c ++打开的文件的文件描述符?所以......

 #include <iostream>
 #include <fstream>
 using namespace std;

 int main() {
      ifstream inputFile( "file.txt",ios::in );
      cout << inputFile.fileDesc << endl;//made up call
      return 0;
 }
Run Code Online (Sandbox Code Playgroud)

问题是,ifstreams是否存在类似fileDesc的东西?如果不是我该怎么做呢?

c++ file-descriptor stream filestream

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

ELF文件格式

我正在尝试手动将使用g ++编译的elf文件的hexdump加载到我设计的处理器模拟中.标准elf文件有30个部分,我正在加载所有30个段,并考虑到它们正确的内存位置偏移.然后我在该.text部分的开头(00400130)启动我的程序计数器,但似乎程序运行不正常.我使用SPIM作为黄金标准,相对彻底地验证了我的处理器设计.奇怪的是,如果我将一个汇编文件加载到SPIM中,然后取出软件生成的反汇编.text.data部分,将它们加载到我的处理器内存中,程序就可以工作了.这与我想做的不同,因为我想:

  • 写一个c ++程序
  • 使用mipseb-linux-g ++(交叉编译器)编译它
  • hex将所有部分转储到自己的文件中
  • 读取文件并将内容加载到处理器"内存"中
  • 运行程序

我最初应该在ELF文件中放置程序计数器的位置?我现在就开始了.text.另外,我只需要包含.text并使.data我的程序正常工作吗?我在这做错了什么?

c++ compiler-construction simulation elf spim

3
推荐指数
1
解决办法
5184
查看次数

关于STDIN STDOUT STDERR的问题

我正在用c ++设计MIPS模拟器,我的简化操作系统必须能够偶尔运行stat()(当我的模拟器上执行的程序需要输入或输出时).

问题是,我需要能够将STDIN,STDOUT和STDERR作为参数提供给stat"stat("stdin",buff)"其中buff是指向插入点的指针,对于返回的结构数据,在内存中.实际上我将使用fstat(),它使用文件描述符指向要统计的文件.我的简单操作系统中的文件描述符表为stdin,stdout和stderr保留0,1和2.我对STDIN等有些困惑.它们是流,我意识到,它们是在stdio.h中定义的,但是我在世界上如何获得一个stat结构,其中包含有关每个流的文件的所有相关信息?

c++ statistics file-descriptor stream

3
推荐指数
1
解决办法
3361
查看次数

将Float转换为整数等效

我想将浮点用户输入转换为等效的整数.我可以通过接受一个输入字符串来做到这一点,比如说"-1.234"然后我可以显式地将每个字符转换为它的十进制表示.(顺便说一下大端).所以我只想说我给的例子,

-1.234 = 1|01111111|00111011111001110110110

sign bit = 1 = 128<<31
exponent bits = 01111111 = 127<<23
mantissa bits = 00111011111001110110110 = 1962934
decimal equivalent = 1962934 + 127<<23 + 128<<31
Run Code Online (Sandbox Code Playgroud)

这很容易但不实用.有一个更好的方法吗?也许我会做某种类型的铸造?

c++ floating-point integer

2
推荐指数
1
解决办法
3081
查看次数

从数组中捕获字符串

我试图找出如何从某个给定位置开始从数组中获取字符串.假设我们有一个任意长的数组,我的字符串从位置1000开始.如果我想从文件中获取一个字符串,我会简单地使用像getc或scanf之类的东西.如何在阵列而不是文件上执行这些相同的功能?

*哦,请记住,数组是int类型,并且充满了ASCII字符的数字表示.

c# arrays string

1
推荐指数
2
解决办法
559
查看次数

我的交叉编译器总是编译相同的文件

我正在测试以确保我的交叉编译器正常工作.当我编译hello world时,似乎编译得很好但是当我将hello.cpp更改为循环1000次的同一程序时,生成的elf文件大小完全相同.无论我做什么改变,文件总是相同的大小,据我所知,具有相同的内容.什么会导致这个?

c++ compiler-construction gcc elf

0
推荐指数
1
解决办法
147
查看次数

将ASCII字符串转换为十进制和十六进制表示

我需要将像"hello2"这样的ASCII字符串转换为十进制和十六进制表示形式(数字形式,具体类型无关紧要).所以,"你好"将是:68 65 6c 6c 6f 32 in HEX.如果不使用巨大的if语句,我如何在C++中执行此操作?

编辑:好的,这就是我选择的解决方案:

int main()
{
    string c = "B";
    char *cs = new char[c.size() + 1];
    std::strcpy ( cs, c.c_str() );
    cout << cs << endl;

    char a = *cs;
    int as = a;
    cout << as << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ decimal

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