심볼 테이블

Development/C 2011. 7. 31. 22:37

심볼 테이블 (Symbol Table)에 대해 알아보자. 
우리는 코딩을 할 때 메모장, vc++ 등의 편집기나 컴파일 툴을 이용한다. number 라는 변수를 선언을 할때 다음과 같이 단순하게 처리한다.

int number; 


우리는 number라는 int형 변수를 선언하는 것이지만, 
컴퓨터는 숫자로만 기억한다. number라는 이름을 기억하는 것이 아니다. 우리가 사용하는 number라는 이름과 매칭을 시키기 위해 컴파일러는 심볼 테이블이라는 것을 생성한다. 다음 변수를 선언한다면, 심볼 테이블을 어떤식으로 만드는지 간단하게 살펴보자.

int number;
long sum;


변수 number와 변수 sum을 선언을 하면 심볼 테이블은 다음과 같이 만들어진다.

 

심볼테이블은 주소기반으로 한다. 변수가 선언되면 테이블을 생성하여 변수의 타입과 이름, 주소를 생성한다. 그리고 변수에 초기화를 하면 심볼 테이블에서 변수를 찾아 해당 주소에 값을 넣는다. 심볼 테이블은 컴파일러가 생성하고 컴파일이 끝이 나면 사라진다. 
다음은 주소값에 할당되어지는 메모리를 나타낸다.

 

int 형은 4바이트이므로 주소가 0x0023ff7c 에서 0x0023ff7f 까지 할당된다. long 형도 4바이트이므로 0x0012ff78 에서 0x0012ff7b 까지 할당된다. 주소값은 시스템에 따라 달라질 수 있으므로 신경쓰지 않아도 된다. 개념만 이해하자.

출처 - ?

'Development > C' 카테고리의 다른 글

심볼 테이블 (Symbol Table)  (0) 2012.01.31
프로그래머 10계명  (1) 2011.09.25
C 언어 컴파일 과정  (0) 2011.02.20
toolchain 이란  (0) 2011.02.12
C - 문자 '0'과 문자 '\0'의 차이 그리고 NUL과 NULL의 차이  (0) 2011.02.12
Posted by linuxism
,

linux - UID, EUID

System/Linux 2011. 7. 26. 14:54
리눅스 시스템은 다중 사용자가 사용할 수 있는 서버용 운영체제입니다. 따라서 사용자에 따라 사용 권한을 다르게 지정할 수 있습니다.

리눅스 시스템에서는 사용자 계정에 따라 사용자 ID를 부여하여 관리합니다. 사용자 ID는 정수 값이며 사용자를 구분하기 위한 값입니다. 리눅스 시스템은 사용자가 로긴하면 해당 사용자 계정에 대응하는 사용자 ID를 실제 사용자 ID(Real User ID)라고 부르고 프로세스가 수행할 때 권한은 유효 사용자 ID(Effective User ID)에 따릅니다.

일반적으로 로긴한 사용자 계정의 권한은 프로세스 수행할 때의 권한과 일치합니다. 이는 대부분 실제 사용자 ID와 유효 사용자 ID는 같다는 거입니다. 그런데 set user id bit를 설정한 프로그램을 실행할 때는 실제 사용자 ID와 유효 사용자 ID가 일치하지 않을 수 있습니다. 이 때는 해당 프로그램 소유자 계정과 대응하는 사용자 ID가 유효 사용자 ID입니다.

이는 일부 프로그램을 동작할 때 수행 권한이 일반 사용자 권한이 아닌 관리자 권한으로 동작할 수 있게 하기 위해서입니다.

또한 리눅스 시스템에서는 프로그램이 동작 중에 유효 사용자 ID를 변경하는 기능을 제공하고 있습니다.




출처 - http://ehpub.co.kr/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%8B%9C%EC%8A%A4%ED%85%9C-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-8-1-%EC%8B%A4%EC%A0%9C-%EC%82%AC%EC%9A%A9%EC%9E%90-idreal-user-id%EC%99%80-%EC%9C%A0%ED%9A%A8/









커널은 프로세스마다  가지 번호를 부여한다실제 UID(RUID) 유효 UID(EUID), 실제 GID(RGID),유효 GID(EGID) 네가지이다. “실제(Real)” 번호들은 계정 관리를 위해서 사용되고 “유효(Effective)” 번호들은 접근 권한을 결정할 목적으로 사용된다보통 경우에는 실제 번호와 유효 번호가 동일하다프로세스의 소유자는 프로세스에게 시그널 보낼   있고 프로세스의 스케쥴링 우선권을 낮출 수도 있다.

정상적이라면 프로세스는 자신에게 부여된 네가지 소유권 신임장을 바꿀  없지만 유효 사용자 번호와 유효 그룹 번호를 바꿀  있는 특별한 상황이 존재한다다른 프로그램 파일을 실행하고 싶은 프로세스는 exec 시스템  가족 중의 하나를 호출한다이런 상황이 발생했을  새로운 프로그램의 이미지를 담고 있는 파일의 "setuid" "setgid" 허가 비트가 설정되어 있다면 프로그램의 유효 UIDGID 실행되는 파일의 UID GID 설정된다exec /bin/passwd 같은 프로그램들이 수퍼유저의 특권을 잠시 빌리기 위해서 사용하는 방법이다(passwd /etc/passwd 수정하기 위하여이런 특권이 필요하다).



출처 -  http://blog.naver.com/wooya510/60010145231










파일의 실행 권한과 관련된 내용입니다.

 

리얼 유저 아이디, 즉 uid는 실제로 파일을 실행하는 유저의 아이디를 가리키며 이펙티브 유저 아이디, euid는 실행 될 때의 유저 아이디를 가리킵니다.

그리고 프로그램이 실행될 때 다른 파일에 접근 권한 같은 것은 euid에 따라 결정됩니다.

 

일반적으로는 uid와 euid가 동일합니다만 특수한 경우들이 있습니다.

예를 들어 패스워드 변경할 때 쓰는 프로그램인 passwd를 보겠습니다.

 

passwd 프로그램은 사용자의 패스워드를 받아서 /etc/passwd 혹은 /etc/shadow를 고치게 되는데 보시면 이 파일들은 root만이 접근 가능하게 되어 있습니다.

 

만약 passwd를 실행하여 일반 유저 계정의 패스워드를 새로 입력했는데 일반적인 경우라면 uid와 euid가 동일하므로 이 passwd 프로그램은 역시 일반 유저 권한으로 실행이 될 테고 /etc밑의 파일은 root 권한이 필요하므로 실행은 실패하게 될 것입니다.

 

하지만 passwd 프로그램은 setuid라는 설정이 되어 있어서(ls -l로 보았을 때 실행권한(x로 표시되는)이 s로 된 경우) 실행될 때의 euid는 늘 root가 되게 됩니다. 일반 유저가 실행해도 root가 실행하는 것처럼 되는 것입니다.

 

다른 예로 C를 아신다면 다음과 같은 프로그램을 짜서 테스트 해보시기 바랍니다.

 

main()
{
        printf("getuid : %d\n", getuid());
        printf("geteuid : %d\n", geteuid());
}

그리고 컴파일 한 후 실행파일에 chmod u+s a.out 을 해 줍니다.

그냥 실행하면 uid와 euid가 동일하게 나오지만 다른 유저로 실행하면 uid와 euid가 다르게 나올 것입니다.

 

이 때 uid가 리얼 유저 아이디, euid가 이펙티브 유저 아이디가 됩니다. 실제 실행시킨 유저와 실행시 어떤 유저의 영향력을 가지는가의 차이라고 보시면 되겠습니다.

:: 네이버 지식in 中




출처 - http://bupung.tistory.com/m/post/52

[출처] UID, EUID|작성자 이주한

Posted by linuxism
,

불혹

기타/좋은글 2011. 6. 15. 02:41
세상일에 정신을 빼앗겨 갈팡질팡하거나 판단을 흐리는 일이 없게 되었음을 뜻한다. 공자가 40세에 이르러 직접 체험한 것으로, 《논어》〈위정편()〉에 언급된 내용이다. 

《논어》〈위정편〉에서 공자는 일생을 회고하며 자신의 학문 수양의 발전 과정에 대해 ‘나는 15세가 되어 학문에 뜻을 두었고(), 30세에 학문의 기초를 확립했다(). 40세가 되어서는 미혹하지 않았고() 50세에는 하늘의 명을 알았다(). 60세에는 남의 말을 순순히 받아들였고() 70세에 이르러서는 마음 내키는 대로 해도 법도를 넘어서지 않았다( )’라는 말을 남겼다.

출처 - 네이버 

'기타 > 좋은글' 카테고리의 다른 글

기억력  (0) 2011.11.19
공자  (0) 2011.06.15
공자 말씀  (0) 2011.06.15
마음을 다스리는 글 - 공자 말씀  (0) 2011.06.15
Posted by linuxism
,