사이드바 영역으로 건너뛰기

게시물에서 찾기분류 전체보기

Ubuntu 8.04 Server에서 VirtualBox 설치하고 USB 사용하기? 아니 삽질기!

<< 변경이력 >>
2008. 7. 18. : 처음 작성


---------------
  무던히도 더운 여름날 어떤 까닭에서인지 잘 쓰던 시스템이 언제부턴가 작은 에러 창을 내 보인다.  시작할 때만 생기는 작은 문제라 급한 다른 일에 밀려 우선순위를 뒤로 두고 있었는데 날이 더워서인지 갑자기 짜증이.....  결국 긴 시간 들여 시스템을 갈아 엎었다.  아! 에러창 보다는 자그마치 4GiB 메모리를 장착하고도 3.4GiB 정도 밖에 사용하지 못하고 있는 현실이 더 짜증 났던 것 같다.

  하여간, 이런 이유로 시스템을 갈아 엎기로 결정했고, 무엇보다 4GiB 메모리를 온전하게 사용하기 위한 목적이기에 선택은 몇 가지가 있었는데, 내가 좋아하는 Kubuntu 환경을 사용해야 했고,  갈아엎는 시간을 최소화 해야했기에 커널 재컴파일 같은 일은 하지 않기로 했다. 또한, 주 용도가 32비트 어플리케이션 개발이기에 아직까지 한 번도 사용하지 않은 64bit 판은 32bit 판에 비해 우선순위가 밀렸다.  그래서 내린 결론은 이랬다.  아! 그러나... 시스템을 갈아엎는다는 것은 생각한 시간보다 더 잡아 먹는다는 경험상의 진리를 다시 한 번 느껴야 했다.

  1) Kubuntu 8.04 Alternative 32bit 판
  이럴줄은 몰랐다. 분명 7.10판을 사용하는 Ubuntu Server 32bit 판에서는 4GiB 메모리를 제대로 인식하는 것을 확인했음에도, Kubuntu Desktop은 몰라도 Alternative 판은 Ubuntu Server 판에서 사용하는 커널과 비슷할 줄 알았다.  혹시라도 다른 언급이 있을 줄 알고 미리 문서를 대충 훑어보긴 했으나 별다른 소리가 없길래 ....  결국 1)번 선택은 포기하고 2)번으로...

  2) Kubuntu 8.04 Alternative 64bit 판
  걱정이 많았다. 아직까지 한 번도 써 본 적이 없기 때문에 어떤 문제가 발생할지 불안했다.  단 한가지 4GiB 메모리는 제대로 쓸 수 있다는 점만 확신하고 시도했다.  그러나,  설치부터 문제가 발생했는데, 웹에서 흔히 보이는 커널 패러미터 문제였다.  두 가지 정도 해결책이 있다길래 패러미터를 고쳐서 해보았지만 불행인지 다행인지 해결되지 않는다.  차라리, 잘 된 일... 과감히 2)번 포기하고 3)번으로.... (내게는 이걸 해결해야만 할 이유도 없었고, 무엇보다 그럴 시간이 없었다.)

  3) Ubuntu 8.04 Server 32bit 판
  사실 여기까지는 그다지 시간이 걸리지 않았다. 1)번이야 시스템 설치 한 번 한게 다니까.. 2)번은 과감히 포기했기에...  마지막, 3)번... 이 단계에서는 예기치 못한 문제가 기다리고 있었는데 다름아닌 제목에 있던 VirtualBox에서의 USB 사용 문제였다.  설치도 깔끔했고, 4GiB 메모리도 제대로 인식하고, Kubuntu-Desktop 환경도 설정했다. 

  흠... 덥다.
  대충 가자.

  쿠분투 데스크 탑 ... KDE4 환경 멋있긴 하지만 웬지 무겁다.
  우분투 데스크 탑 ... 그놈환경... KDE4에 비해 밋밋한듯 하고 특히 세션관리가 쿠분투에 비해 맘에 들지 않는다. 그러나 낙점!


  VirtualBox 설치하기

  이 설명은 인터넷에 많이 널려있다.  영문판이긴 하지만, 

Howto Install VirtualBox 1.6 in Ubuntu 8.04(Hardy Heron) including USB Support

  이 좋다.  그림까지 곁들여 있으니 나 같은 사람에게도 굿~!
  초 간단 요약하면, 다운로드 받은 파일을 설치하고 커널 모듈을 컴파일 해야하기 때문에 미리 헤더를 설치해야 한다. 명령 순서를 정리하면....
  1) apt-get install virtualbox_1.6.2-31466_Ubuntu_hardy_i386.deb
  2) apt-get install kernel-devel
  3) apt-get install build-essential linux-headers-`uname -r`

  VirtualBox에서 USB 장치 사용하기


  VirtualBox 1.5.6 OSE 설치 ... 어라? USB가 지원 안 되네? 여기저기 이래저래 하면 된다고 나오는데 나는 다 안 된다. 과감히 포기하고 Sun xVM (VirtualBox 1.6.2) 설치.... 아싸! 관리화면에 USB 항목이 분명히 눈에 띈다.  이젠 되는구나 싶었다. 근데? USB 항목을 클릭하면, 기대와 다르게 Could not load the Host USB Proxy Service (VERR_FILE_NOT_FOUND). The service might be not installed on the host computer.  ???

USB 항목을 설치했을 때 나오는 에러

이 창이 뜬다면 위에 링크 걸어 놓은 문서  Enable USB Support in Virtualbox 부분을 보시라!!!
요약할 것도 없지만 요약하면, /etc/init.d/mountdevsubfs.sh 스크립트에서, "Magic"을 검색해서 나오는 부분 4줄이 코멘트 처리되어 있는 것을, 열어주면 된다.

이렇게 되어 있는 것을,
    #
    # Magic to make /proc/bus/usb work
    #
    #mkdir -p /dev/bus/usb/.usbfs
    #domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,listmode=0644
    #ln -s .usbfs/devices /dev/bus/usb/devices
    #mount --rbind /dev/bus/usb /proc/bus/usb

이렇게 고쳐주란 얘기
    #
    # Magic to make /proc/bus/usb work
    #
    mkdir -p /dev/bus/usb/.usbfs
    domount usbfs "" /dev/bus/usb/.usbfs -obusmode=0700,devmode=0600,listmode=0644
    ln -s .usbfs/devices /dev/bus/usb/devices
    mount --rbind /dev/bus/usb /proc/bus/usb


  자! 위 내용이 제대로 적용되고 리부팅 되었다면, 에러창 대신에 USB 설정화면을 볼 수 있다.


왼쪽 아래 도움말 단추를 누르면 설명이 나오는데, 안타깝게도 영문이다. 읽어봐도 무슨 소린지 모르겠다. 허나, USB 장치를 사용하는데 아무런 지장은 없다.  (혹시 필터가 어떤 기능인지 아시는 분 설명좀...)


  사실 여기까지는 "Ubuntu 8.04 VirtualBox USB"로 검색하면 나오는 문서에 모두 나오는 얘기다. 여기까지 하면 게스트 OS에서 두둥~하는 소리와 함께 USB 장치를 사용할 줄 알았다. 내 기억으로도 1.4.x 버전까지는 별 문제 없이 사용 할 수 있었다. 게스트 OS를 부팅하면 뭔가 되는 것 처럼 느껴지긴 했다. USB 장치를 꽂은 상태로 게스트 OS를 부팅하면 주변장치 상태창의 USB 버튼에 흐릿하긴 하지만 USB 장치 리스트가 보였으니까... 그러나 "흐릿한 불안감"은 역시나~!  메뉴에서 "장치 > USB 장치"를 선택해도 USB 장치 리스트가 보이긴 하지만, 선택할 수가 없다!

 

 


상태창도 마찬가지!



이런 저런 시도를 해보았으나, 모두 허사로 돌아갔다. 심지어는, 그 동안 들인 시간을 포기하고, VMware 를 선택할까 생각했으니까!

그러다가 결국 방법을 찾아냈는데, 위에 링크한 영문 링크에서다. 그 문서 본문에도 나오지 않는 얘기를 댓글에서 찾아냈으니, 모래알에서 바늘 찾는것 만큼이나 어려운 댓글에서 진주를 찾아낸 격!


  1. Edmund Says:

    You can try these commands or even add them to your startup script (e.g. in Ubuntu /etc/rc.local)
    1) VBOX=$(grep vboxusers /etc/group | sed ’s/vboxusers:x:(.*):.*/1/’)
    2) sudo mount -t usbfs -o devgid=$VBOX,devmode=664,nodev,noexec,nosuid none /proc/bus/usb

(Copy & Paste를 했는데, 앞에 번호가 이상하게 딸려오네... 원래는 4번 댓글임)
수 정한 부분은 1)번 라인 sed 명령의 홑따옴표를 쌍따옴표로 바꿔줬다. 자세히 살펴보면 검색에서 걸리는 문서에 간혹가다 보이는 /etc/fstab에 추가하라는 항목과 비슷하다. 결국, 그 부분을 애써 무시한 탓이었을까? 가능하다면 배포본 자체의 시스템 파일은 건들이지 않으려고 하다보니 생긴 일일 수도 있겠다. 하여간, 이 부분을 실행하니 게스트 OS에서 USB 장치를 제대로 인식한다!  아~! 정말이지.....

 


  결국, fstab 파일을 수정하지 않아서 생긴 삽질이었다.  /etc/fstab 파일에 딱 한줄 추가했을 뿐인데....

none /proc/bus/usb usbfs devgid=124,devmode=664 0 0


여기서 "devgid=124"는 vboxusers 그룹번호다. /etc/group 파일에서 확인할 수 있다.

vboxusers:x:124:hts



  다 쓰고나지 허망하다. 결국, 다른 블로그에 올라온 글과 차이가 없다. 차이가 있다면 안 해도 되었을 삽질이란 점.  날도 덥고 할 일도 많은데, 이 무슨 지랄인가 말이다. 아! 한 가지! 상 당히 많은 블로그에서 공통으로 얘기하고 있는 부분이 /etc/udev/rules.d/40-permissions.rules 파일 내용에 GROUP=vboxusers 항목을 추가하라는 말이 있는데, 내 경우에는 이 부분은 안 해 줬다. /etc/fstab 파일에 한 줄 추가하기 전 까지는 이 부분을 추가해 줬지만, 해줘도 별 무소용! 안 해 줘도 되는 건 과감히 안 해 주는 편이 좋다.


  별 특징없는 글을 마무리해야겠다. ㅠㅡ;

  우분투 8.04 서버 32비트 배포판에서 VirtualBox 를 설치하고, USB 장치를 사용하려면,

  1) OSE 판 말고, www.virtualbox.com에서 VirtualBox 1.6.2 판을 설치하라. (커널 모듈을 추가해야 하기 때문에, 커널 헤더를 설치해야 한다.)

  2) /etc/init.d/mountdevsubfs.sh 스크립트를 수정하라.

  3) /etc/fstab 파일에 한 줄 추가하라.


진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크

우분투에서 듀얼모니터 설정

* 큰 맘 먹고 구입한 24인치 LCD 모니터, 그래픽 카드 역시 모니터 보다는 못하지만 역시 큰 맘 먹고 구입한 NVidia 7300gt 모델!
* 원래 가지고 있던 18.1 인치 모델과 듀얼 모니터 시도!
* 아뿔싸! 안/된/다!
* 이래저래 하면 되긴 하지만, 1920x1200 해상도는 어디로 가고 낮은 해상도로 보여주던가, D-Sub 가 메인 화면으로 잡히질 않나... ㅠㅡ;
* 결국 삽질(?) 끝에 성공!


# nvidia-xconfig: X configuration file generated by nvidia-xconfig
# nvidia-xconfig:  version 1.0  (buildmeister@builder3)  Wed Sep 12 14:29:35 PDT 2007


Section "ServerLayout"
    Identifier     "Layout0"
    Screen      0  "Screen0" 0 0
    InputDevice    "Keyboard0" "CoreKeyboard"
    InputDevice    "Mouse0" "CorePointer"
    Option         "Xinerama" "Off"
EndSection

Section "Files"
    RgbPath         "/usr/X11R6/lib/X11/rgb"
EndSection

Section "Module"
    Load           "dbe"
    Load           "extmod"
    Load           "type1"
    Load           "freetype"
    Load           "glx"
EndSection

Section "InputDevice"

    # generated from default
    Identifier     "Mouse0"
    Driver         "mouse"
    Option         "Protocol" "auto"
    Option         "Device" "/dev/psaux"
    Option         "Emulate3Buttons" "no"
    Option         "ZAxisMapping" "4 5"
EndSection

Section "InputDevice"

    # generated from default
    Identifier     "Keyboard0"
    Driver         "kbd"
EndSection

Section "Monitor"
    Identifier     "Monitor0"
    VendorName     "Unknown"
    ModelName      "Unknown"
    Horizsync       31.5-74.5
    Vertrefresh     56.0 - 65.0
    Gamma       1.0
EndSection

Section "Device"
    Identifier     "Device0"
    Driver         "nvidia"
    VendorName     "NVIDIA Corporation"
    Option         "ModeValidation" "NoDFPNativeResolutionCheck"
EndSection

Section "Screen"
    Identifier     "Screen0"
    Device         "Device0"
    Monitor        "Monitor0"
    DefaultDepth    24
    Option         "TwinView" "On"
    Option         "TwinViewXineramaInfoOrder" "DFP,CRT"
    Option         "TwinViewOrientation" "LeftOf"
    Option         "IncludeImplicitMetaModes" "True"
    Option         "Metamodes" "DFP: 1920x1200,CRT: 1280x1024"

    SubSection     "Display"
        Depth       24
#        Virtual     1920 1200
#     Modes       "1920x1200@60"
    EndSubSection
EndSection

진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크

파이어폭스에서 SSL 접속이 안될 경우


우분투 대퍼를 사용하다, 한동안 업그레이드를 하지 않다가, Feisty가 나오길래 Edgy로 업그레이드 후, 바로 Feisty로 업그레이 한 이후 잘 되는 듯 하였는데 파이어폭스 사용 중 난관에 봉착 -_-;;
SSL을 사용하는 사이트만 들어가면 다음과 같은 메시지를 보여주면서 반응이 없다.

서버로부터 기대하지 않은 응답을 받음
이 서버와의 통신 방법을 알 수 없습니다.

    *   시스템에 개인 보안 관리자가 설치 되어 있는지 확인해 보십시오.
    *   서버의 정상적이지 않은 설정 때문일 수도 있습니다.    

개인 보안 관리자? 서버가 비정상?
아무리 구글링을 해도 오래 전 자료만 보이고, 또 내 상황과는 맞지 않아서 거의 포기할 무렵, 이 문제가 libnss3.so 파일과 관련 있음을 알게 되었다.

 Heinrich Wunram said on 2007-05-03: (permalink)

I had the same problem as described here. I couldn't enter webpages starting with https. Now I found the reason for this strange behaviour: In my firefox folder (/usr/lib/firefox) was an old version of libnss3.so (that of firefox 1.0.7). So I copied libnss3.so from /usr/lib to the firefox folder (don't forget to make it executable) and now my firefox is working correctly again. May be that this procedure might also help other posters in this thread to solve their problem.


그러나, 글에 나와 있는대로 해 보아도 해결되지 않고, .mozilla 디렉터리를 삭제해 보아도 마찬가지!

결국 libnss3 패키지와 firefox 패키지를 모조리 삭제하고 난 다음에야 정상적으로 SSL 을 사용할 수 있었다.

재미난 것은 보안상의 문제인지, /usr/lib/libnss3.so 파일을 move로 백업했다가 복구해도 SSL을 사용 할 수 없다는 점.
진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크

Ubuntu 7.04에서 VMware 설치하기

우분투 Edgy 사용 시 아무런 문제가 없던 VMware 가 Feisty 로 업그레이드 하고 난 뒤 vmware-config.pl 에서 에러가 발생한다.
문제는 Feisty에서 커널이 2.6.20-15 로 올라온 탓인데 이를 해결하는 방법은, 다음 패치를 적용하는 것이다.
--- compat_kernel.h     2006-11-13 13:06:18.000000000 -0800
+++ ../../vmmon-only.20/include/compat_kernel.h 2006-12-22 07:02:59.000000000 -0800
@@ -18,7 +18,9 @@
* provided by x86-64, arm and other (but not by i386).
*/ 
#define __NR_compat_exit __NR_exit
+#if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,19)
static inline _syscall1(int, compat_exit, int, exit_code);
+#endif


/*

위 패치를 아래처럼 적용한다. (patchfile 의 내용은 위 패치파일의 내용)
root@papyrus:~# cd /usr/lib/vmware/modules/source/vmmon-only/include
root@papyrus:/usr/lib/vmware/modules/source/vmmon-only/include#patch -p0 < patchfile

여기까지 되었으면 /usr/lib/vmware/modules/source 로 이동한 다음, vmmon.tar 파일을 삭제하고 다시 만든다.
root@papyrus:~# cd /usr/lib/vmware/modules/source# tar cvf vmmon.tar vmmon-only

나머지는 vmware-config.pl 명령을 예전처럼 실행하면 끝난다.
root@papyrus:~# vmware-config.pl


참고 원문은 여기를 누르세요.
진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크

Lexmark e120 프린터 리눅스에서 사용하기

렉스마크 E120 모델! 네트워크 모델(E120n)에 비해 절반 값 밖에 되지 않지만 혼자 집에서 사용하기에는 가격 대비 성능 짱!
게다가 동봉된 씨디에는 MS 윈도우 계열 OS 이외에 드라이버까지 포함되어 있어서 더욱 믿음직스럽다.
그.러.나!!!
포함되어 있는 씨디의 드라이버를 아무리 설치해도 제대로 동작하지 못하고, 구글링을 해보아도 별 도움을 받지 못했지만, 결국 역시 구글링을 통해 해결!

방법은 매우 간단해서 cups 시스템에서 Lexmark > Optra E 모델을 선택한 다음, lj4dith 드라이버를 선택하면 끝~!
(*추천드라이버로 바꾸어도 되는군요.)

테스트 환경은 우분투 7.04 Feisty-Fawn (Edgy에서 업그레이드 하자마자!)
진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크

How to change default soundcard

 

How to change default soundcard

  • View available soundcards
sudo asoundconf list
  • You should get something like this
Names of available sound cards:
Live
V8237
  • Switch soundcard with 'example' being the name of the preferred soundcard
sudo asoundconf set-default-card example

http://ubuntuguide.org/wiki/Ubuntu_Edgy#How_to_change_default_soundcard
진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크

리눅스에서 NTFS 읽고 쓰기!

리눅스 환경에서 NTFS를 사용하는 것은 "읽기"만 가능했다. 실제로 최근 배포판만 하더라도 기본 설치시 "읽기"만 가능하다.  그러나, 이미 2000년 즈음 Anton Altaparmakov 에 의해 소스포지에 Linux-NTFS 프로젝트가 시작되었고, 현재는 Szabolcs Szakacsits에 의해 NTFS-3g라는 이름으로 차세대(?) 프로젝트가 진행중이다.

Linux-NTFS 프로젝트 사이트 http://www.linux-ntfs.org/
NTFS-3g 프로젝트 사이트 http://wiki.linux-ntfs.org/doku.php?id=ntfs-3g

우분투 6.06 버전에는 Linux-NTFS 프로젝트의 산물인 ntfsprogs 1.12.1이 포함되어 있다. (현재 ntfsprogs 의 최신버전은 1.13.1이다.)  synaptic이건 adept건 ntfsprogs를 설치하게 되면 ntfstools 패키지도 함께 설치된다.  언제나 그렇듯이 알아서 잘 설치해 준다.
그러나, 실제 사용하기 위해 마운트를 시도하면

root@papyrusnb:/mnt# ntfsmount /dev/hda1 ./winxp/
fuse: failed to exec fusermount: 그런 파일이나 디렉토리가 없음
fuse_mount failed.
Unmounting:


이런 에러 메시지를 만나게 되는데 이는 메시지에서도 짐작 할 수 있듯이 fusermount 프로그램을 찾지 못했기 때문에 발생한다.
이 문제는 fuse-utils 설치하면 해결된다. (http://forum.linux-ntfs.org/viewtopic.php?p=1233&sid=340c394a246c64c4ecb49a3ca53d5c4b)

NTFS를 마운트 했다면 이제 그 안에 들어있는 파일을 지우거나 새로운 파일을 만들어 보시라.  (실수로라도 시스템파일을 지우진 말고..)
진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크

cygwin 사용중 설정한 부분

1.  cygwin.bat 파일

@echo off

C:
chdir C:cygwinbin

rem bash --login -i
rxvt -vb -fg grey -bg black -fn "Lucida Console" -sl 5000 -geometry 100x60 -e /bin/bash --login -i

2. .gvimrc
$ cat .gvimrc
set ruler
set smartindent
set cindent
set ai
set lines=48
set columns=100
set guifont=Bitstream_Vera_Sans_Mono:h10:cANSI
진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크

AIX PROC 에서 나오는 몇 가지 문제들...

2005년 12월 9일 이글루 블로그에 적었던 글
--
1. pthread.h 를 include 하려면,

define=_POSIX_SOURCE 를 넣어라.

2. fd_set 에서 아래와 같은 에러가 발생하면,
define=_XOPEN_SOURCE_EXTENTED 를 추가하라!


Syntax error at line 169, column 5, file /home/hts/Nextware.20/comm.include/hts_trgw.h:
Error at line 169, column 5 in file /home/hts/Nextware.20/comm.include/hts_trgw.
h
   fd_set master_rfdset;   /* trgw global read fdset */
....1
PCC-S-02201, Encountered the symbol "fd_set" when expecting one of the following


<리눅스 /usr/include/features.h 중 일부>

/* These are defined by the user (or the compiler)
  to specify the desired environment:

  __STRICT_ANSI__  ISO Standard C.
  _ISOC99_SOURCE   Extensions to ISO C89 from ISO C99.
  _POSIX_SOURCE    IEEE Std 1003.1.
  _POSIX_C_SOURCE  If ==1, like _POSIX_SOURCE; if >=2 add IEEE Std 1003.2;
           if >=199309L, add IEEE Std 1003.1b-1993;
           if >=199506L, add IEEE Std 1003.1c-1995;
           if >=200112L, all of IEEE 1003.1-2004
  _XOPEN_SOURCE    Includes POSIX and XPG things.  Set to 500 if
           Single Unix conformance is wanted, to 600 for the
           upcoming sixth revision.
  _XOPEN_SOURCE_EXTENDED XPG things and X/Open Unix extensions.
  _LARGEFILE_SOURCE    Some more functions for correct standard I/O.
  _LARGEFILE64_SOURCE  Additional functionality from LFS for large files.
  _FILE_OFFSET_BITS=N  Select default filesystem interface.
  _BSD_SOURCE      ISO C, POSIX, and 4.3BSD things.
  _SVID_SOURCE     ISO C, POSIX, and SVID things.
  _GNU_SOURCE      All of the above, plus GNU extensions.
  _REENTRANT       Select additionally reentrant object.
  _THREAD_SAFE     Same as _REENTRANT, often used by other systems.
  _FORTIFY_SOURCE  If set to numeric value > 0 additional security
           measures are defined, according to level.

  The `-ansi' switch to the GNU C compiler defines __STRICT_ANSI__.
  If none of these are defined, the default is to have _SVID_SOURCE,
  _BSD_SOURCE, and _POSIX_SOURCE set to one and _POSIX_C_SOURCE set to
  199506L.  If more than one of these are defined, they accumulate.
  For example __STRICT_ANSI__, _POSIX_SOURCE and _POSIX_C_SOURCE
  together give you ISO C, 1003.1, and 1003.2, but nothing else.

  These are defined by this file and are used by the
  header files to decide what to declare or define:

  __USE_ISOC99     Define ISO C99 things.
  __USE_POSIX      Define IEEE Std 1003.1 things.
  __USE_POSIX2     Define IEEE Std 1003.2 things.
  __USE_POSIX199309    Define IEEE Std 1003.1, and .1b things.
  __USE_POSIX199506    Define IEEE Std 1003.1, .1b, .1c and .1i things.
  __USE_XOPEN      Define XPG things.
  __USE_XOPEN_EXTENDED Define X/Open Unix things.
  __USE_UNIX98     Define Single Unix V2 things.
  __USE_XOPEN2K        Define XPG6 things.
  __USE_LARGEFILE  Define correct standard I/O things.
  __USE_LARGEFILE64    Define LFS things with separate names.
  __USE_FILE_OFFSET64  Define 64bit interface as default.
  __USE_BSD        Define 4.3BSD things.
  __USE_SVID       Define SVID things.
  __USE_MISC       Define things common to BSD and System V Unix.
  __USE_GNU        Define GNU extensions.
  __USE_REENTRANT  Define reentrant/thread-safe *_r functions.
  __USE_FORTIFY_LEVEL  Additional security measures used, according to level.
  __FAVOR_BSD      Favor 4.3BSD things in cases of conflict.
  The macros `__GNU_LIBRARY__', `__GLIBC__', and `__GLIBC_MINOR__' are
  defined by this file unconditionally.  `__GNU_LIBRARY__' is provided
  only for compatibility.  All new code should use the other symbols
  to test for features.

  All macros listed above as possibly being defined by this file are
  explicitly undefined if they are not explicitly defined.
  Feature-test macros that are not defined by the user or compiler
  but are implied by the other feature-test macros defined (or by the
  lack of any definitions) are defined by the file.  */
진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크

GCC 4.0.2 와 AIX 5.3에서 발생하는 char형 문제

2005년 12월 18일 이글루 블로그에 적었던 글.
--

1. 증상


2. 시스템환경에서 아래 코드를 실행시키게 되면 솔라리스(sparc)와 GNU/Linux (intel)에서는
c -1, n -1, size of c 1
uc 255, un 255, size of uc 1

결과를 볼 수 있으나, 1번 환경에서는
c 255, n 255, size of c 1
uc 255, un 255, size of uc 1
를 볼 수 있다.
signed char형이 signed int형으로 확장될 경우 sign bit는 그대로 확장되는 것이 정상이나 이상한 현상을 보인다.
확인한 결과, 옵션으로 -fsigned-char 를 주어야  솔라리스, 리눅스 환경에서의 결과와 같아짐.
아마도, 가져다 사용한 GCC 가 default option이 -funsigned-char로 동작하도록 빌드되어 있는것 같다.



#include
int
main(int argc, char *argv[])
{
  char c;
  int  n;
  c = 255;
  n = c;
  printf("c %d, n %d, size of c %dn", c, n, sizeof(c));
  unsigned char uc;
  int un;
  uc = 255;
  un = uc;
  printf("uc %x, un %x, size of uc %dn", uc, un, sizeof(uc));
  return 0;
}

2. 시스템 환경

$ uname -a
AIX htstest 3 5 00CEBE7F4C00 unknown unknown AIX

$ gcc --version
gcc (GCC) 4.0.2
Copyright (C) 2005 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


3. 결론

-fsigned-char 옵션을 사용하라!


--
종이한장
진보블로그 공감 버튼트위터로 리트윗하기페이스북에 공유하기딜리셔스에 북마크