0

環境変数を使用してロードすると問題が発生するため、rodata セグメントに文字列の値を設定する方法を理解しようとしています。rodataセクションに定数文字列を外部から設定したい。この関数は、実行されるコードから独立している必要があります。だから、私がするとき

"objdump -c foo"

ファイル foo.c を使用せずに、rodata セクションでこの文字列を登録する必要があります。.rodata セクションに定数を設定するにはどうすればよいですか?

編集: Linux OS と GCC の使用

Cコードが変更されていることを意味するため、環境変数を使用することはできません。Cコードを変更せずに、「Goo」などの定数をrodataセグメントに追加します。

4

2 に答える 2

0

私は、多かれ少なかれあなたが望むと思うことを行う小さなbashスクリプトを書くことができました.

まず、このサンプル プログラムを考えてみましょう。

test.c

#include <stdio.h>
const char message[1024] = "world";
int main()
{
    printf("hello %s\n", message);
}

ターゲット変数は になりますmessage。変数のサイズを変更しないことに注意してください。これは混乱を招きます。必要なだけのメモリを確保するように注意してください。

今スクリプト:

パッチシム

#!/bin/bash
# usage: patchsym PROGRAM SYMBOL < NEWCONTENT
EXE="$1"
SYMBOL="$2"
OFFS=$((0x$(objdump -t "$EXE" | grep " $SYMBOL$" | cut -d ' ' -f 1)))
OFFS=2176
dd of="$EXE" bs=1 seek=$OFFS conv=notrunc

新しいメッセージの内容は次のとおりです。

新しいメッセージ

universe^@

(^@実際には NUL 文字です)。

今すぐ実行してください:

$ gcc test.c -o test
$ ./test
hello world
$ ./patchsym test message < newmsg
$ ./test
hello universe
于 2015-08-29T22:51:52.073 に答える