我正在尝试编译不使用动态加载程序的可执行文件(ELF文件).我构建了一个交叉编译器,它编译linux中的mips,用于我制作的模拟器上.我在编译hello.cpp文件(hello world program)时声明了标志-static-libgcc.显然这还不够.因为我的可执行文件中仍有一个段包含动态加载程序的名称/路径.我用什么标志来生成包含需要运行的所有内容的可执行文件?我需要重建我的交叉编译器吗?
我在查找如何在Cygwin上安装Ant时遇到了一些麻烦.我想用Ant来构建Nutch.我查看过一堆教程,但是找不到任何低级别的东西让我理解.我需要像......
有人可以帮我从这里出去吗?
我试图弄清楚如何使用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) 我正在尝试将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) 有没有办法访问用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的东西?如果不是我该怎么做呢?
我正在尝试手动将使用g ++编译的elf文件的hexdump加载到我设计的处理器模拟中.标准elf文件有30个部分,我正在加载所有30个段,并考虑到它们正确的内存位置偏移.然后我在该.text部分的开头(00400130)启动我的程序计数器,但似乎程序运行不正常.我使用SPIM作为黄金标准,相对彻底地验证了我的处理器设计.奇怪的是,如果我将一个汇编文件加载到SPIM中,然后取出软件生成的反汇编.text和.data部分,将它们加载到我的处理器内存中,程序就可以工作了.这与我想做的不同,因为我想:
我最初应该在ELF文件中放置程序计数器的位置?我现在就开始了.text.另外,我只需要包含.text并使.data我的程序正常工作吗?我在这做错了什么?
我正在用c ++设计MIPS模拟器,我的简化操作系统必须能够偶尔运行stat()(当我的模拟器上执行的程序需要输入或输出时).
问题是,我需要能够将STDIN,STDOUT和STDERR作为参数提供给stat"stat("stdin",buff)"其中buff是指向插入点的指针,对于返回的结构数据,在内存中.实际上我将使用fstat(),它使用文件描述符指向要统计的文件.我的简单操作系统中的文件描述符表为stdin,stdout和stderr保留0,1和2.我对STDIN等有些困惑.它们是流,我意识到,它们是在stdio.h中定义的,但是我在世界上如何获得一个stat结构,其中包含有关每个流的文件的所有相关信息?
我想将浮点用户输入转换为等效的整数.我可以通过接受一个输入字符串来做到这一点,比如说"-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)
这很容易但不实用.有一个更好的方法吗?也许我会做某种类型的铸造?
我试图找出如何从某个给定位置开始从数组中获取字符串.假设我们有一个任意长的数组,我的字符串从位置1000开始.如果我想从文件中获取一个字符串,我会简单地使用像getc或scanf之类的东西.如何在阵列而不是文件上执行这些相同的功能?
*哦,请记住,数组是int类型,并且充满了ASCII字符的数字表示.
我正在测试以确保我的交叉编译器正常工作.当我编译hello world时,似乎编译得很好但是当我将hello.cpp更改为循环1000次的同一程序时,生成的elf文件大小完全相同.无论我做什么改变,文件总是相同的大小,据我所知,具有相同的内容.什么会导致这个?
我需要将像"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++ ×8
elf ×3
linker ×2
stream ×2
ant ×1
arrays ×1
build ×1
c# ×1
compilation ×1
cygwin ×1
decimal ×1
executable ×1
filestream ×1
gcc ×1
install ×1
integer ×1
posix ×1
readelf ×1
simulation ×1
spim ×1
statistics ×1
string ×1
struct ×1