검색결과 리스트
글
제목처럼 거창할 건 없지만 nm이란 명령을 사용하면 라이브러리의 내용을 볼 수 있다.
위키 백과에서는 아래와 같이 설명하고 있다.
 
nm은 다수의 최신 유닉스와 유닉스 계열 운영 체제에 포함되어 있는 명령어이다. nm은 라이브러리, 컴파일된 오브젝트 모듈, 공유 오브젝트 파일, 독립 실행파일등의 바이너리 파일을 검사해서 그 파일 들에 저장된 내용 또는 메타 정보를 표시한다. nm은 디버깅 과정에서 이름 겹침과 C++ 이름 맹글링 문제를 해결하거나 툴체인의 다른 부분을 확인하는 데 사용된다.
GNU 프로젝트는 높은 기능을 갖춘 nm 프로그램을 GNU Binutils 패키지에 포함시키고 있다. GNU 툴체인의 다른 부분과 함께 주어진 nm 바이너리는 특정 컴퓨터 아키텍처와 바이너리 포맷만을 위해 컴파일 된 것이므로 의심스런 바이너리를 검사하기 위해 nm을 사용하는 보안 전문가들은 보통 여러 타겟 용으로 만들어 놓은 nm 바이너리를 갖고 있다.
출처 : 위키백과내가 현재 사용하는 리눅스에서의 help 페이지이다.
List symbols in [file(s)] (a.out by default).
The options are:
-a, --debug-syms Display debugger-only symbols
-A, --print-file-name Print name of the input file before every symbol
-B Same as --format=bsd
-C, --demangle[=STYLE] Decode low-level symbol names into user-level names
The STYLE, if specified, can be `auto' (the default),
`gnu', `lucid', `arm', `hp', `edg', `gnu-v3', `java'
or `gnat'
--no-demangle Do not demangle low-level symbol names
-D, --dynamic Display dynamic symbols instead of normal symbols
--defined-only Display only defined symbols
-e (ignored)
-f, --format=FORMAT Use the output format FORMAT. FORMAT can be `bsd',
`sysv' or `posix'. The default is `bsd'
-g, --extern-only Display only external symbols
-l, --line-numbers Use debugging information to find a filename and
line number for each symbol
-n, --numeric-sort Sort symbols numerically by address
-o Same as -A
-p, --no-sort Do not sort the symbols
-P, --portability Same as --format=posix
-r, --reverse-sort Reverse the sense of the sort
-S, --print-size Print size of defined symbols
-s, --print-armap Include index for symbols from archive members
--size-sort Sort symbols by size
--special-syms Include special symbols in the output
--synthetic Display synthetic symbols as well
-t, --radix=RADIX Use RADIX for printing symbol values
--target=BFDNAME Specify the target object format as BFDNAME
-u, --undefined-only Display only undefined symbols
-X 32_64 (ignored)
@FILE Read options from FILE
-h, --help Display this information
-V, --version Display this program's version number
'개발관련 > 기타' 카테고리의 다른 글
| 표준출력과 표준오류출력 그리고 컴파일러 옵티마이저 레벨 (0) | 2013.11.05 |
|---|---|
| 개발 시 성능을 고려함에 있어... (0) | 2013.10.31 |
| 명령 인자 처리에 대한 고민... (0) | 2013.10.31 |
| (signed) char와 unsigned char의 차이로 인한 구분의 필요성에 대해 (0) | 2013.10.30 |
설정
트랙백
댓글
글
숙제 : unsigned char랑 char의 차이점. 꼭 구분해서 써야하는 예를 알려주세요.
위의 숙제를 받고 혼자 생각해본 바는...
이미 알고 있던 사전지식으로는 자료형은 맨 앞에 부호 비트가 있다. 이것이 signed 자료형이고 unsigned로 선언이 되면 부호비트를 일반 데이터비트로 사용하게 되어 데이터를 저장하게 된다.
대부분의 인터넷 검색 자료에서는 이로 인해 데이터 표현범위가 2배로 늘어나게 된다고 하는데...
실상 생각해보면 같은게 아닐까 한다. 양의 정수쪽으로는 표현범위가 2배 늘어나겠지만 음의 정수로 표현하는 범위를 상실했으니 표현 범위의 넓이는 결과적으로 같은게 아닐까?
signed char는 8비트이다. 첫 1비트를 부호비트로 쓰기 때문에 표현 범위는 -2^7~+2^7-1이 될 것이다. 고로 -128~+127이 되니 256개의 표현이 된다.
unsigned char 또한 8비트이지만 첫 1비트 또한 데이터비트이기 때문에 표현 범위는 2^8-1이 될 것이다. 고로 0~255가 된다.
이걸 구분해야 하는 이유가 있을 때는 어떤 때일까?
몇몇 블로그를 방문해 내요을 본 결과 대부분의 사람들은 1bit씩 나누어 통신을 하거나 무언가 비트 단위 작업을 할때 문제를 야기할 수 있다고 한다.
1bit씩 나누어 통신을 하는 경우에 발생하는 오류는 일반 환경에서는 발생하지 않지만 임베디드 환경에서는 발생 할 수 있다고 하는데 컴파일러 문제인지 잘 모르겠다;
char buf; 를 선언하고 RS-232 등의 통신을 위해 한 바이트식 전송을 하려고 할때 buf에 들어가는 값이 0xA0 부터 즉, sign bit 가 1이 되는 시점부터 그 값을 잘못 읽어 sizeof(char) = 1 임에도 불구하고 0xFFFFFFA0 가 되어 실제로 전송되는 값은 FF가 되는 문제가 발생을 할 수 도 있다.
[출처] 데이터는 unsigned char 로!|작성자 구차니
또, 비트단위 작업의 경우 비트단위 연산자를 쓰면 오류가 발생한다는데 예제를 찾지 못했다. 대충 예상을 해보면 10진수로 표현했을 때 정수값이 같더라도 비트값은 틀리다는 것을 말하는 걸까 싶다.
뒤늦게 찾은 예제?
1.
void main()
{
unsigned char c=0x80;
printf("%u\n",c);
printf("%d\n",c);
}
실행 결과
128
128
unsigned char는 1바이트로 0~255를 표현이 가능합니다.
%u는 인자를 unsigned int 값으로 표현하는 포멧입니다.
인자 c는 unsigned char이고 출력 포멧은 unsinged int여서 묵시적 형변환이 진행됩니다.
둘 다 부호가 없는 표현이므로 묵시적 형변환이 진행될 때 늘어나는 메모리의 값은 0으로 채워집니다.
따라서 0000 0000 0000 0000 0000 0000 1000 0000 로 형변환됩니다.
여전히 10진수로 128이므로 실행 결과는 128이 출력됩니다.
%d는 인자를 int 값으로 표현하는 포멧입니다.
unsigned char는 부호를 표현하지 않으므로 묵시적 형변환이 진행될 때 늘어나는 메모리의 값으 0으로 채워집니다. 마찬가지로 0000 0000 0000 0000 0000 0000 1000 0000 로 형변환됩니다.
여전히 10진수로 128이므로 실행 결과는 128이 출력됩니다.
2.
void main()
{
char c=0x80;
printf("%u\n",c);
printf("%d\n",c);
}
실행 결과
4294967168
-128
char는 1바이트로 -128~127 을 표현이 가능합니다. 물론, ASCII 코드가 0~127까지 약속되어 있어서 문자를 표현할 때 많이 사용되어 형식 명을 char라 부르게 된 것이죠.
%u는 인자를 unsigned int 값으로 표현하는 포멧입니다.
인자 c는 char이고 출력 포멧은 unsinged int여서 묵시적 형변환이 진행됩니다.
char는 부호가 있는 표현인데 최상위 비트가 1이면 음수입니다. 0x80은 1000 0000 으로 음수입니다. 묵시적 형변환이 진행될 때 늘어나는 메모리의 값은 부호비트로 채워집니다.
따라서 1111 1111 1111 1111 1111 1111 1000 0000 로 형변환됩니다.
부호없는 10진수로 4294967168 이므로 실행 결과는 4294967168를 출력합니다.
%d는 인자를 int 값으로 표현하는 포멧입니다.
인자 c는 char이고 출력 포멧은 int여서 묵시적 형변환이 진행됩니다.
char는 부호가 있는 표현인데 최상위 비트가 1이면 음수입니다. 0x80은 1000 0000 으로 음수입니다. 묵시적 형변환이 진행될 때 늘어나는 메모리의 값은 부호비트로 채워집니다.
따라서 1111 1111 1111 1111 1111 1111 1000 0000 로 형변환됩니다.
부호있는 10진수로 -128 이므로 실행 결과는 -128을 출력합니다.
찾아본 마지막으로 오류 처리를 위한 결과 값을 if 문에 사용할 때이다.
보통 아래와 같이 작성을 하는데...이 때 unsigned char의 경우 조건문을 의도한대로 탈 수 없다는 것입니다.
if([함수 이름이나 함수 리턴값이 담긴 변수 이름] < 0) bla~ bla~
머...이건 별로 유념하지 않아도 될 것 같긴 합니다만...
'개발관련 > 기타' 카테고리의 다른 글
| 표준출력과 표준오류출력 그리고 컴파일러 옵티마이저 레벨 (0) | 2013.11.05 |
|---|---|
| 개발 시 성능을 고려함에 있어... (0) | 2013.10.31 |
| 명령 인자 처리에 대한 고민... (0) | 2013.10.31 |
| 라이브러리(오브젝트) 내용 보기 (0) | 2013.10.30 |
설정
트랙백
댓글
글
제목은 거창하지만 별건 아니지만 익숙해지면 꽤나 유용할 것 같은데 잘 안써서 금새 잊어버리고 막상 쓰려면 기억이 안난다.
블로깅 해두고 기억이 안나면 찾아보는 용도로 해야겠다.
이 기능을 이용하기 전에 나는 vim에서 소스를 편집하다가 테스트를 위해 저장하고 나온 후 make(컴파일)를 수행하거나 별도의 창을 띄워 make를 수행한다.
이 일련의 과정은 무척이나 번거롭다.
이 경우 vim에서 편집을 하다가 저장을 한 후 명령라인(:입력)에서 make를 입력하자.
해당 환경이 정상적인 Makefile을 찾았다면 익히 컴파일 하던데로 수순을 따를 것이다. 만약 Makefile을 의도한데로 찾지 못한다면 ':make -f Makefile' 명령을 이용해 의도한 결과를 볼 수 있을 것이다.
위와 같이 make를 수행하면 화면 하단에 make 메시지가 출력된다. 에러 메시지가 많을 때는 기억하기 힘드니 이럴땐 ':copen'을 입력해보자. 그렇게 하면 화면 하단이 분할되면서 make 메시지가 출력되어있다.
발생한 에러메시지에서 엔터를 입력하면 기존 vim창에서 해당 라인으로 이동한다.
'개발관련 > 환경관련' 카테고리의 다른 글
| 디버그 메시지 심기 (0) | 2013.10.11 |
|---|
RECENT COMMENT