stab

명칭
     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 (으)로부터 등장했습니다.