STAB(5)

명칭
stab - 심볼 테이블의 형태

서식
<stab.h>

해설
<stab.h> 파일은 a.out 파일로 사용되는, 심볼 테이블의 몇개의 n_type 필드치의 정의합니다. 이것들은, 항구적인 심볼 형식이며 (즉, 로컬인 label등으로는 없다), 낡은 디버거이다 sdb (이)나 Berkeley 파스칼 컴파일러 pc(1) 그리고 사용됩니다. 심볼 테이블 엔트리는 .stabs 어셈블러 지시문에 의해 생성할 수가 있습니다. 여기에서는, 더블 쿼츠로 단락지어진 이름, 심볼의 형태, 심볼에 붙은 char 1 개(살)과 short 1 개(살) 분의 정보, 그리고 (통상은 주소를 나타낸다) unsigned long 의 정수를 지정할 수 있습니다. address field에 명시적인 label를 생성하는 것을 피하기 (위해)때문에, .stabd 지시문을 사용해, 현재의 장소를 가리키도록(듯이) 할 수가 있습니다. 만약 이름이 필요없는 경우, .stabn 지시문을 사용하는 것으로, 심볼 테이블 엔트리를 생성할 수가 있습니다. 로더는, .stab 지시문에 의해 생성된 심볼 테이블의 엔트리순서를 바꾸지 않는 것 (을)를 프로텍션합니다. a.out(5) 에 기술되고 있도록(듯이), 심볼 테이블의 요소는 이하의 구조를 가집니다.

    /*
    * 심볼 테이블 엔트리의 서식
    */
    struct nlist {
    	union {
    		char	*n_name;	/* 코어 내부 (in-core)에서 사용 */
    		long	n_strx;		/* 파일 캐릭터 라인표에의 인덱스 */
    	} n_un;
    	unsigned char	n_type;		/* 형의 플래그 */
    	char		n_other;	/* 사용되어 있지 않다 */
    	short		n_desc;		/* 이하의 struct desc 참조 */
    	unsigned	n_value;	/* 주소 또는 오프셋(offset) 또는 행 */
    };

n_type 필드의 하위 비트는, 심볼을 고작 1 개의 세그먼트(segment)에 두기 (위해)때문에 에 사용합니다. 어느 세그먼트(segment)에 둘까는 <a.out.h> 안에서 정의되고 있는 이하의 마스크에 근거합니다. 이러한 세그먼트(segment) 비트를 설정하지 않게 하는 것으로, 심볼을 어느 세그먼트(segment)에도 속하지 않게 할 수가 있습니다.

    /*
    * n_type 의 단순한 값
    */
    #define	N_UNDF	0x0	/* 정의되어 있지 않다 */
    #define	N_ABS	0x2	/* 절대 지정 */
    #define	N_TEXT	0x4	/* 텍스트 */
    #define	N_DATA	0x6	/* 데이터 */
    #define	N_BSS	0x8	/* bss */
    #define	N_EXT	01	/* 외부 참조를 나타내는 비트(or 해 사용한다) */

심볼의 n_value 필드는, 링커 ld(1) 에 의해, 올바른 세그먼트(segment)내의 주소에 재배치됩니다. 어느 세그먼트(segment)에도 들어가 있지 않은 심볼의 n_value 필드는, 링커에 의해 변경되지 않습니다. 게다가 n_type 필드에서, 이하의 비트의 모두 세트되어 있지 않은 경우는, 링커는 자신이 가지고 있는 규칙에 따라, 몇개의 심볼을 파기합니다.

    /*
    * 그 외의 영속적인 심볼 테이블 엔트리에서는, N_STAB 의 몇개의 비트가
    * 세트 되고 있습니다. 이것들은,<stab.h> 안에 기술이 있습니다.
    */
    #define	N_STAB	0xe0	/* 만약 이러한 비트중 한쪽이 세트 되고 있으면 파기되지 않습니다 */

이것으로, 112 (7 * 16) 개까지의 심볼을, 다양한 세그먼트(segment)로 나누어 정의할 수 있게 됩니다. 이러한 몇개인가에 대해서는 이미 진술되고 있습니다. 낡은 상징적 디버거 sdb (은)는, 이하의 n_type 치를 사용합니다.

    #define	N_GSYM	0x20	/* 글로벌 심볼 : name, , 0, type, 0 */
    #define	N_FNAME	0x22	/* 수속명 (f77 kludge): name, , 0 */
    #define	N_FUN	0x24	/* 수속: name, , 0, linenumber, address */
    #define	N_STSYM	0x26	/* 정적 심볼: name, , 0, type, address */
    #define	N_LCSYM	0x28	/* .lcomm 심볼 l: name, , 0, type, address */
    #define	N_RSYM	0x40	/* 레지스터 심볼: name, , 0, type, register */
    #define	N_SLINE	0x44	/* 소스행: 0, , 0, linenumber, address */
    #define	N_SSYM	0x60	/* structure elt: name, , 0, type, struct_offset */
    #define	N_SO	0x64	/* 원시 파일명: name, , 0,0, address */
    #define	N_LSYM	0x80	/* 로컬 심볼: name, , 0, type, offset */
    #define	N_SOL	0x84	/* #include 된 파일명: name, , 0,0, address */
    #define	N_PSYM	0xa0	/* 파라미터: name, , 0, type, offset */
    #define	N_ENTRY	0xa4	/* 별의 엔트리: name, linenumber, address */
    #define	N_LBRAC	0xc0	/* 왼쪽이나 와: 0, , 0, nesting level, address */
    #define	N_RBRAC	0xe0	/* 오른쪽이나 와: 0, , 0, nesting level, address */
    #define	N_BCOMM	0xe2	/* 공통의 개시 부호: name, , */
    #define	N_ECOMM	0xe4	/* 공통의 종료 부호: name, , */
    #define	N_ECOML	0xe8	/* (로컬명의) 공통의 종료 부호: , , address */
    #define	N_LENG	0xfe	/* 길이 정보를 가진 2번째의 stab 엔트리 */

여기서, 코멘트에는 주어졌다 n_type 의 n_name, n_other, n_desc, n_value 필드 (와)과 .stab s 의 전형적인 이용법이 쓰여져 있습니다. sdb (은)는, 휴대용 C 컴파일러 cc(1) 에 의해 사용되는 형식의 형태의 지정자를 가지고 있다 n_desc 필드를 사용합니다. 이러한 형태의 값의 포맷의 자세한 것은 헤더 파일 pcc.h (을)를 참조해 주세요.

Berkeley 파스칼 컴파일러 pc(1) (은)는, 이하의 n_type 값을 사용합니다:

    #define	N_PC	0x30	/* 글로벌인 파스칼 심볼: name, , 0, subtype, line */

라고 이하의 서브형을 사용해, 다른 컴파일 파일에 걸치는 형태 체크를 실시합니다.

    1	원시 파일명
    2	인클루드 된 파일명
    3	글로벌인 label
    4	글로벌인 정수
    5	글로벌인 형태
    6	글로벌인 변수
    7	글로벌인 함수
    8	글로벌인 수속
    9	외부 함수
    10	외부 수속
    11	프로그램 라이브러리 변수
    12	프로그램 라이브러리 routine

관련 항목
as(1), ld(1), a.out(5)

버그
좀 더 기본적인 형식이 필요하겠지요.

역사
stab 파일은 4.0BSD (으)로부터 등장했습니다.