hello world を glibc を介さずに標準出力に出力する C のコード(クロス開発)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ほいしょー

hello world を glibc を介さずに標準出力に出力する C のコード(クロス開発)

#1

投稿記事 by ほいしょー » 11年前

hello world を glibc を介さずに標準出力に出力する C のコードを書き、 実行形式を構築せよ。 ただし、構築には target と異なる環境で powerpc-linux-* (target環境はSUZAKU) を利用し、QEMU を用いて動作確認を行うこと。

という問題が解けません。下記は、glibc を介さずようにwrite関数を使うためにカーネルシステムを直接叩いてみたものです。ほぼ本から持ってきたのであんま理解していません。

%powerpc-linux-gnu-gcc -m32 -Os -fno-builtin -fomit-frame-pointer -fno-ident -c hello_4.c

でビルドしたところ、

hello_4.c: In function 'write':
hello_4.c:28:erroe: impossible constract in 'asm'

とエラーが出ました。エラーを出なくする方法もしくは、全く違う方法で、glibc を介さずに標準出力に出力する方法を教えて頂けたらと思います。

コード:

#include <asm/unistd.h> 
#define __syscall_return(type, res) (type)(res)  
#define _syscall1(type,name,type1,arg1) ¥ type name(type1 arg1) ¥

 { ¥
 long __res; ¥
 __asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" ¥       
  : "=a" (__res) ¥        
  : "0" (__NR_##name),"ri" ((long)(arg1)) : "memory"); ¥ __syscall_return(type,__res);¥       

}
  
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) ¥ type name(type1 arg1,type2 arg2,type3 arg3) ¥ 
{ ¥ 
long __res; ¥ 
__asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" ¥         
  : "=a" (__res) ¥         
  : "0" (__NR_##name),"ri" ((long)(arg1)),"c" ((long)(arg2)), ¥                 
  "d" ((long)(arg3)) : "memory"); ¥ __syscall_return(type,__res); ¥
 }  

inline _syscall1(int, exit, int, status); 
inline _syscall3(int, write, int, fd,  const void*, buf, unsigned long, count);  

void hello() 
{
   write(1, "Hello World¥n", 12);   
  exit(0);
 }   


アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: hello world を glibc を介さずに標準出力に出力する C のコード(クロス開発)

#2

投稿記事 by みけCAT » 11年前

対象の環境は知らないですが、とりあえずIdeone.comでコンパイル(リンクは未定義)が通る形まで修正しました。

コード:

#include <asm/unistd.h> 
#define __syscall_return(type, res) (type)(res)
#define _syscall1(type,name,type1,arg1) type name(type1 arg1) \
 \
 { \
 long __res; \
 __asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" \
  : "=a" (__res) \
  : "0" (__NR_##name),"ri" ((long)(arg1)) : "memory"); __syscall_return(type,__res);\
 \
}
  
#define _syscall3(type,name,type1,arg1,type2,arg2,type3,arg3) type name(type1 arg1,type2 arg2,type3 arg3) \
{ \
long __res; \
__asm__ volatile ("push %%ebx ; movl %2,%%ebx ; int $0x80 ; pop %%ebx" \
  : "=a" (__res) \
  : "0" (__NR_##name),"ri" ((long)(arg1)),"c" ((long)(arg2)), \
  "d" ((long)(arg3)) : "memory"); __syscall_return(type,__res); \
 }

inline _syscall1(int, exit, int, status); 
inline _syscall3(int, write, int, fd,  const void*, buf, unsigned long, count);

void hello() 
{
    write(1, "Hello World\n", 12);
    exit(0);
 }
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: hello world を glibc を介さずに標準出力に出力する C のコード(クロス開発)

#3

投稿記事 by みけCAT » 11年前

9行目と18行目の"0"を"a"に変えるとどうなりますか?
http://stackoverflow.com/questions/1478 ... int-in-asm
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

ほいしょー

Re: hello world を glibc を介さずに標準出力に出力する C のコード(クロス開発)

#4

投稿記事 by ほいしょー » 11年前

>みけCATさん
返信ありがとございます!

9行目と18行目の"0"を"a"に変えてみましが、同じエラーが出ますね><
もう少し頑張ってみます。ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る