関数の引数の値を書き換えたいです。
DGBのx/iコマンドでアッセンブラをみて
レジスタに格納された引数の値を書き換えようと考えています。
このコマンドで書き換えたい関数の$ebpを見て書き換える予定です。
引数を書き換えたい関数の戻り値が構造体であるかないかで、$ebpからのアドレスの位置が変更されてしまいます。
他に格納されている関数の引数のアドレスが1つに固定できる方法はないでしょうか?
できないとしたら、条件で関数の戻り値が構造体かどうかの判断はどこでつければよいでしょうか?

このQ&Aに関連する最新のQ&A

A 回答 (2件)

呼び出された関数の中でsetコマンドを使って変更することが出来るはずですが、そういうことではないのでしょうか?

    • good
    • 0

構造体へのポインタを返すように関数を書換える... かなぁ?

この回答への補足

具体的には、どのようにすればよいか教えていただけますか?

補足日時:2005/04/13 23:53
    • good
    • 0
この回答へのお礼

考え方が一つ増えました。
ありがとうございます。

お礼日時:2005/04/14 23:04

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q環境変数とシェル変数

UNIXのシェルスクリプトで使用するシェル変数と環境変数とはどういった違いがあるのでしょうか?どのように使い分ける必要があるのでしょうか?また、このような使い方をすると間違いがおこりやすいといった具体的な例など教えていただければ助かります。

Aベストアンサー

環境変数はforkした子プロセス(及び子シェル呼び出し)に引き継がれ、呼ばれた子プロセスはそれらを参照する事が出来ますが、シェル変数は子プロセスには引き継がれません。

子プロセスが親からの情報を受け取って何かしたい時に環境変数を使います。

Q構造体ポインタ、及び、戻り値のあるマクロ関数の作成方法について

●開発環境
[OS]
Linux 2.6.9

[コンパイラ]
GCC 3.4.6

●質問
以下のプログラム中のTEST関数を、
マクロ関数(#define)にしたいのですが、
やり方がわかりません。

ご存知の方がいらっしゃいましたら、ご教授願います。

--------------------------------
#include <stdio.h>
typedef struct t_str_abc {
unsigned int x;
unsigned int y;
} str_abc;

unsigned int TEST( str_abc *kou );

void main(void)
{
str_abc kouzou;
unsigned int ret;

kouzou.x = 1;
kouzou.y = 2;

ret = TEST(&kouzou);

printf("ret = %d\n", ret);
}

unsigned int TEST( str_abc *kou )
{
unsigned int state;

state = kou->x + kou->y;

return state;
}
--------------------------------

●開発環境
[OS]
Linux 2.6.9

[コンパイラ]
GCC 3.4.6

●質問
以下のプログラム中のTEST関数を、
マクロ関数(#define)にしたいのですが、
やり方がわかりません。

ご存知の方がいらっしゃいましたら、ご教授願います。

--------------------------------
#include <stdio.h>
typedef struct t_str_abc {
unsigned int x;
unsigned int y;
} str_abc;

unsigned int TEST( str_abc *kou );

void main(void)
{
str_abc kouzou;
unsigned int ret;

kouzou.x = 1;
k...続きを読む

Aベストアンサー

目的がよく解らないが、
関数っぽく動かすなら下記の通り

#include <stdio.h>
typedef struct t_str_abc {
unsigned int x;
unsigned int y;
} str_abc;

#define TEST(arg) ((arg)->x + (arg)->y)

int main(void)
{
str_abc kouzou;
unsigned int ret;

kouzou.x = 1;
kouzou.y = 2;

ret = TEST(&kouzou);

printf("ret = %d\n", ret);
}

Q標準入力からシェル変数及び環境変数に値を設定する(bash)

標準入力からシェル変数及び環境変数に値を設定する方法で、cshの場合は「set 変数=$<」ということは確認しているのですが、bashの場合はどのようにすればよろしいのでしょうか?ご教授お願いいたします。

Aベストアンサー

普通はreadを使います。readの完了値でEOFも判断できるのがcshの$<に比べた時の利点です。例えば、
while read a
do echo "$a"
done < file
で、cat file と同じことが出来ます。

aを環境変数にしたければexport aするのは普通のシェル変数と同じ。

あと、cshでのset 変数=$< ですが入力行に空白があると意図しない結果になるので、"$<" とした方がいいです。
sh/bash の read だと、read a b c のように空白(正確には$IFSの値のどれか)で区切られた複数のデータを詠むことも出来ます。詳しくは、man bash に書いてあります。

Qシェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕

シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕方が分かりません。

--------------------------------------------------
#!/bin/sh
. GetYesNo.sh          #外部シェルスクリプトを読み込んで...
GetYesNo $1           #このGetYesNoの戻り値は0か1を出力するようにする。

if[ ??? -eq 0 ]; then      #"???"の部分に何を入力すれば良いか分かりません。
echo "真(0)です。"
else
echo "偽(0以外)です。"
fi
--------------------------------------------------

戻り値が0か1しか出力しない外部シェルスクリプトを読み込んで、その戻り値をtestコマンドを利用して、0か1のどちらかを判定して、それぞれの出力を出したいけれど、どうやって出来ますでしょうか。
色々な方法を試してみましたが、ダメでした。
上記のコードの書き間違いがあると思いますが、あったらご指摘をお願いします。

シェルスクリプト(sh)の関数の戻り値とtestコマンドによる判定の仕方が分かりません。

--------------------------------------------------
#!/bin/sh
. GetYesNo.sh          #外部シェルスクリプトを読み込んで...
GetYesNo $1           #このGetYesNoの戻り値は0か1を出力するようにする。

if[ ??? -eq 0 ]; then      #"???"の部分に何を入力すれば良いか分かりません。
echo "真(0)です。"
else
echo "偽(0以外)です。"
fi
------------------------------------------...続きを読む

Aベストアンサー

GetYesNo.shの中で GetYesNo()が定義されていて、return 0 か return 1で戻り値を返す、ということでよろしいでしょうか?

方法1) 特殊変数$?の利用

GetYesNo $1
if [ "$?" -eq 0 ] ; then

直前のステータスなので、間に他のコマンドを実行しているとそちらの値になる

GetYesNo $1
echo "$?" # $?=GetYesNo $?の戻り値
if [ "$?" -eq 0 ] ; then #$?= echo "$?"の戻り値

方法2) GetYesNoを直接使用
test 命令( とその省略形の[ )は不要

# GetYesNo $1 #ここにはいらない
if GetYesNo $1 ; then

Q他のアカウントの環境変数を読み込ませ、自作シェルを動作させたいです。

複数ファイル収集用のシェルを作成(他人作)、起動しましたが、現在使用できるアカウントではパスが通っていないため、目的のファイルの一部が収集できない状態で困っています。シェルの中身を見ましたがパスの指定がなかったため取得できていない状態でした。シェルの中身を書き換えることは他人様作成の為できませんので、、、他のパスの通っているアカウントの環境変数を読み込んだ後、そのシェルを起動したいのですがコマンド(env?)等やり方を教えてもらえないでしょうか。なお読み込ませたい環境変数はパスだけです。宜しく御願い致します。m(__)m

Aベストアンサー

他人のスクリプトを勝手に書き換えられない -> コピー
して自分のものとして書き換えては?

Q変数$importfileに第1引数($1)のファイルPATHを表示したい

下記のスクリプトを書きましたが
./aa.sh: line 6: =/tmp: command not found
と言われるのはなぜですか?


変数$importfileに第1引数($1)のファイルPATHを表示したいです。




1 #/bin/bash
2
3 echo $#
4 if [ $# -eq 1 ]
5 then
6 $importfile=$1
7 echo "$importfile"
8 else
9 echo "argv file notfound"
10 exit;
11 fi
12

実行結果
./aa.sh /tmp
1
./aa.sh: line 6: =/tmp: command not found

Aベストアンサー

× $importfile=$1
○ importfile=$1

Qシェルスクリプト 環境変数RS

シェルスクリプト 環境変数のRSの意味を教えていただけますでしょうか?

また、RSの中身を変更すると、どういった違いが発生するか、実際に体感
できる、スクリプトサンプルを頂けましたら助かります。

よろしくお願いいたします。

Aベストアンサー

すみません、勘違いしてました

> RSを空文字にすれば、ファイル全体を1レコードとして読み込みます。

RSを空文字にすれば、「空行までを」1レコードとして読み込みます。

と訂正します。

より詳細には、awkのマニュアルを読むことをお勧めします。日本語訳もあります。

Qコマンドの戻り値を変数に代入したい

初歩的な質問で失礼します。

echo "aiueo" > 変数
というようなことをやりたいのですが、できますでしょうか?

具体的には、ftpコマンドのメッセージを
変数に代入したいなと思っています。

echo "(略)" | ftp -n > 変数

Aベストアンサー

変数に入れるのなら、
AAAA=`echo aiueo`

AAAA=`echo aaaaa| ftp -n `

QApache2で子プロセスのシェルの環境変数を設定したい

はじめまして、お世話になります。
先ほどまでSolarisの方で質問をしていたのですが、どうにも過疎のようでしたので、改めてこちらで質問させていただきます。よろしくお願いします。

現在Solaris10の上にApache2を載せ、そのうえでとあるPHPプログラムを動かしているのですが、そのプログラムの機能の拡張を施そうとしたところ、動作がうまくいかなくて困っています。
問題点を調べた結果、そのプログラムが呼び出しているプログラム(ImageMagickのconvert)が動作するために環境変数の設定が必要なのに、それが設定されていないということが原因であるようでした。
そこで質問なのですが、Apache2の子プロセスで使用される(シェルの)環境変数を設定するにはどのようにしたら良いのでしょうか?

サーバに不慣れな上、Solarisに触るのも初めてで、おまけにシェルが単なるshのためますます設定が分かりません。
ちょっとしたことでも構いませんので、どうか知恵をお貸しください。

Thanks in Advance.

Aベストアンサー

PHPはよく知らんのですが、PHPの中でputenv()関数で環境変数を設定してからconvertを呼び出すのではダメですか?

Qmdbコマンドで引数の値を見たい

初歩的な質問で申し訳ありませんが、ご教授願います。

mdbでのデバッグにおいて、ある関数の引数に渡された値
を確認しようとしているのですが、以下のように
「mdb: failed to read data at ff370040: no mapping for address」
というエラーが表示されて、見ることができません。
#下の例では、crashという関数に渡された値の第一引数
#を見たい


#mdb a.out core
Loading modules: [ ]
> ::stack
crash+0x24(ff370041, ff370041, 2, 1086c, 222d8, ff29bc20)
main+0x60(1, ffbefbcc, ffbefbd4, 20800, 0, 0)
_start+0xb8(0, 0, 0, 0, 0, 0)
> ff370041::dump
0 \/ 2 3 4 5 6 7 8 9 a b c d e f 0v23456789abcdef
mdb: failed to read data at ff370040: no mapping for address
>

何故この領域(0xff370041)の値は見ることができないの
でしょうか?
スタックに割り当てられていないのでしょうか?
ちなみに、プログラムは以下です。
crash関数の「*crash = 1;」の部分でコアを吐かせ、
そのコアファイルを使用しmdbを実行しました。


#include <stdio.h>
#include <nl_types.h>

nl_catd catd;

void crash(char *str)
{
char *crash;

strlen(str);
crash = 0x00;
*crash = 1;
}


void main (void)
{
char *str;
int i=10;

catd = catopen("./test.cat", 0);

str = catgets(catd, 1, 1, "Hello world.\n");
crash(str);
printf("%s", str);

catclose(catd);
}


ちなみに、システム情報は
"SunOS 5.8 Generic_117350-20 sun4us sparc"
になります。

以上、よろしくお願いいたします。

初歩的な質問で申し訳ありませんが、ご教授願います。

mdbでのデバッグにおいて、ある関数の引数に渡された値
を確認しようとしているのですが、以下のように
「mdb: failed to read data at ff370040: no mapping for address」
というエラーが表示されて、見ることができません。
#下の例では、crashという関数に渡された値の第一引数
#を見たい


#mdb a.out core
Loading modules: [ ]
> ::stack
crash+0x24(ff370041, ff370041, 2, 1086c, 222d8, ff29bc20)
main+0x60(1, ffbefbcc, ffbefbd...続きを読む

Aベストアンサー

Solarisのvirtual memory機構によって、
プロセスに対して割り当てられたメモリの範囲外にアクセスしている為だと思います。

(VMがaddress mapできないと文句言っている)


人気Q&Aランキング

おすすめ情報