1

関数 write_file を記述する必要があります。この関数 write_file(int fdOut, char *start1, char *start2) は、出力ファイルのファイル記述子と、メモリにマップされた ELF ファイル構造への 2 つのポインターを受け取ります。セクション ヘッダー テーブル内のすべてのセクション ヘッダーをループし、関連するフィールド (セクション名、オフセット、および長さ) を stdout (デバッグ用) に出力し、それぞれのセクションの内容を出力ファイルに書き込みます。

「それぞれのセクションの内容を出力ファイルに書き込む」にはどうすればよいですか? それは常に0バイトをコピーしています...

これは私が書いたものです: void write_file(int fdOut, char *start_a, char *start_b) {

 char *start1=start_a;
 Elf32_Ehdr *header;
 Elf32_Shdr *curr;
 char *curr_name;
 int i;
 int c;


write(fdOut , start1 , 52);
start1=start_a;

header = (Elf32_Ehdr *)start1;

for(i=0 ; i< header->e_shnum ; i++){
  start1=start_a;
 curr= get_shdr_from_index(i, start1); /*returns a pointer to the requested section header**/
 curr_name=get_section_name(i, start1); /*returns a pointer into the section header string table.**/

 printf("[ %d ] %20s %20x %20x\n", i ,
           curr_name , curr->sh_offset , curr->sh_size);


 if (c=write(fdOut, curr, curr->sh_size)<0) {
  perror("error");
  exit(-1);
}
printf("%d" , c);

}

}

4

2 に答える 2

1

あなたの最初のバグはここにあります:

if (c=write(fdOut, curr, curr->sh_size)<0) { ...

演算子の優先順位については、こちらをご覧ください。あなたが書くつもりだったもの:

if ((c = write(fdOut, curr, curr->sh_size)) < 0) { ...

2 番目のバグは、セクションの内容を fd に書き込むように求められることです。しかし、コンテンツではなくセクションヘッダーを書いています。内容は、元のファイルのオフセットにありcurr->sh_offsetます。そのデータはメモリにまったく存在しない可能性があるため、データを出力する前にlseek、元のファイルとそこからのデータが必要になる可能性があります。readwrite

于 2012-06-24T04:07:45.537 に答える
0

-O binary出力形式を使用します。

objcopy -O binary --only-section=.text foobar.elf foobar.text
于 2012-06-18T05:34:57.570 に答える