'gcc'에 해당되는 글 4건

  1. 2012.08.14 GCC 옵션 : version script
  2. 2011.05.24 GCC옵션: finstrument-functions
  3. 2010.09.10 __builtin_expect 키워드
  4. 2010.07.21 gcc 업그레이드 (4.5.0)
참고 : http://korea.gnu.org/manual/release/ld/ld-sjp/ld-ko_2.html
참고2: http://studyfoss.egloos.com/5254916
참고3: http://stackoverflow.com/questions/8129782/version-script-and-hidden-visibility

gcc 옵션 중 version script라는 게 있다는 사실을 알았다.

정확히는 ld 옵션이기 때문에 gcc에서 옵션을 줄 때는

-Wl,--version-script=파일 경로

의 형태를 가져야 한다.

참고2에서는 버전 관리를 위해 사용했으나,
버전 관리 뿐 아니라 심볼 개수를 줄이는 용도로도 활용이 가능한가 보다.

예컨데,

// t.c

int __attribute__((visibility("default"))) foo() { return 1; }
int bar() { return 2; }
int __attribute__((visibility("default"))) exported() { return 3; }

// t.lds

{
  global
: exported;
  local
: *;
};


gcc t
.c -Wl,--version-script=t.lds -fPIC -shared -o t.so && nm -D t.so
                 w _Jv_RegisterClasses
                 w __cxa_finalize
                 w __gmon_start__
00000000000004f2 T exported

visibility가 default인 값은 두개지만, 그중 exported만 보이는 것을 알 수 있다.

신고
Posted by 소혼
TAG gcc, 옵션
추가 조사 : -finstrument-functions-exclude-file-list
 

instrument-functions 옵션은 함수의 시작과 끝에 다른 함수를 삽입해주는 옵션입니다.
용도는 다양할 것 같지만, 디버깅이 어려운 환경 - 예를 들어 임베디드, 멀티 프로세스 환경, 서버-클라이언트 구조 등에서 큰 도움이 될 것 같습니다.
그 외 많은 프로파일링 툴이 이것을 사용하여 나름의 기능을 구현하는 것 같습니다.

사용 방법은 무척 간단합니다.



__cyg_profile_func_enter 와 __cyg_profile_func_exit는 instrument 옵션이 켜졌을 때 gcc가 연결해주는 함수입니다.
이 함수들은 다른 함수들과 다르게  no_instrument_function이라는 attribute를 가지고 있습니다.
no_instrument_function는 이 함수들에는  __cyg_profile_func_enter와 __cyg_profile_func_exit를 삽입하지 말라는 뜻입니다.

간단한 예제를 짜 보았습니다.

 
이 파일을 gcc로 컴파일하고 실행하면 아래와 같습니다.
# ./a.out 
## this is main()
## this is main() -- 32 

instrument-functions 옵션을 주고 컴파일해보겠습니다.
# gcc -c main.c -finstrument-functions -g
# gcc -c test.c -finstrument-functions -g
# gcc -o b.out main.o test.o
# ./b.out 
> Enter 0x8048561
 ## this is main()
> Enter 0x804850e
> Enter 0x80484ca
> Enter 0x8048454
> Leave 0x8048454
> Leave 0x80484ca
> Enter 0x80484ca
> Enter 0x804848f
> Leave 0x804848f
> Leave 0x80484ca
> Enter 0x80484ca
> Enter 0x8048454
> Leave 0x8048454
> Leave 0x80484ca
> Enter 0x80484ca
> Enter 0x804848f
> Leave 0x804848f
> Leave 0x80484ca
> Enter 0x80484ca
> Enter 0x8048454
> Leave 0x8048454
> Leave 0x80484ca
> Enter 0x80484ca
> Enter 0x804848f
> Leave 0x804848f
> Leave 0x80484ca
> Enter 0x80484ca
> Enter 0x8048454
> Leave 0x8048454
> Leave 0x80484ca
> Enter 0x80484ca
> Enter 0x804848f
> Leave 0x804848f
> Leave 0x80484ca
> Enter 0x80484ca
> Enter 0x8048454
> Leave 0x8048454
> Leave 0x80484ca
> Enter 0x80484ca
> Enter 0x804848f
> Leave 0x804848f
> Leave 0x80484ca
> Leave 0x804850e
> Enter 0x8048454
> Leave 0x8048454
 ## this is main() -- 32
> Leave 0x8048561
 
함수의 시작과 끝에 그 함수의 위치정보가 출력됩니다.
이 정보를 이해할 수 있는 값으로 바꾸어 주는 툴이 있습니다. addr2line입니다.

# addr2line 0x804850e -e b.out -f
a
/workspace/study/c/ins/main.c:23 

이 툴을 이용해서 위 코드를 python으로 변환해보았습니다.

# python converter.py test log
[0x8048561]  > main at main.c:31
 ## this is main()


[0x804850e]    > a at main.c:23
[0x80484ca]      > b at main.c:15
[0x8048454]        > c at main.c:5
[0x80484ca]      > b at main.c:15
[0x804848f]        > d at main.c:10
[0x80484ca]      > b at main.c:15
[0x8048454]        > c at main.c:5
[0x80484ca]      > b at main.c:15
[0x804848f]        > d at main.c:10
[0x80484ca]      > b at main.c:15
[0x8048454]        > c at main.c:5
[0x80484ca]      > b at main.c:15
[0x804848f]        > d at main.c:10
[0x80484ca]      > b at main.c:15
[0x8048454]        > c at main.c:5
[0x80484ca]      > b at main.c:15
[0x804848f]        > d at main.c:10
[0x80484ca]      > b at main.c:15
[0x8048454]        > c at main.c:5
[0x80484ca]      > b at main.c:15
[0x804848f]        > d at main.c:10
[0x8048454]    > c at main.c:5
 ## this is main() -- 32

실제 프로젝트로 해봐야 피부에 와닿을 것 같습니다.
 
신고

'프로그래밍 언어 > C/C++' 카테고리의 다른 글

POD vs non POD  (0) 2011.08.07
memwatch  (0) 2011.05.24
GCC옵션: finstrument-functions  (0) 2011.05.24
linker 관련 링크  (0) 2011.04.15
calloc vs malloc  (6) 2011.04.06
[C언어] a - b < 0 vs. a < b  (0) 2010.10.25
Posted by 소혼
TAG gcc, 옵션
최근 이상한 매크로를 발견하고 추적하던 중 멋진 gcc의 키워드를 발견했다.

__builtin_expect라는 키워드이다.
아래 URL에 좀 더 자세히 적혀있다.
http://galaxyra.linuxstudy.pe.kr/galaxyra/tag/__builtin_expect


한마디로 말하면 실행할 가능성이 높은 애를 위해서 컴파일하도록 하는 매크로이다.

방어적 코딩을 하다보면 무수히 많은 if 문을 넣어야 하는데 아키텍처를 조금이라도 공부한 사람들은 Pipeline Hazard때문에 if문을 꺼리게 된다.
if문의 해악을 없앨순 없지만 되도록 실행가능성이 높은 코드를 밑에 배치해 파이프라인 해저드를 최소화 시킬수 있도록 해주는 키워드가 바로 이 키워드이다.

#define unlikely(x)     __builtin_expect(!!(x), 0)

위처럼 unlikely 키워드를 사용하면 좀 편하다. (위 URL에서 발췌)
if (__builtin_expect(조건문, 0))
과 같이 쓴다.
0이라고 적으면 if문이 false일거라고 가정하고 코드를 배치한다.

이것의 성능을 측정한 자료.
http://blog.man7.org/2012/10/how-much-do-builtinexpect-likely-and.html


신고

'프로그래밍 언어 > C/C++' 카테고리의 다른 글

[C언어] a - b < 0 vs. a < b  (0) 2010.10.25
C로 수행시간 체크하기  (0) 2010.09.30
__builtin_expect 키워드  (0) 2010.09.10
gcc 업그레이드 (4.5.0)  (0) 2010.07.21
Header안에 static 변수  (0) 2010.02.21
디버깅하는 법 - 툴 - ltrace  (0) 2010.02.18
Posted by 소혼
WebKit 작업중에 오류가 발생해서 알아보니
gcc 4.4.1에 버그가 있는 것 같다.

현재까지 우분투 9.10 의 기본 gcc 버전은 4.4.1이다.
그래서 직접 gcc 4.5를 설치해보기로 했다.

gcc 4.5 릴리즈 노트 : http://gcc.gnu.org/gcc-4.5/
gcc SVN 관련 문서 : http://gcc.gnu.org/svn.html

1. gcc 4.5 다운로드
먼저 gcc 4.5를 뜻하는 브랜치를 확인해야하겠기에 아래 명령을 수행한다.
svn ls svn://gcc.gnu.org/svn/gcc/branches

명령의 결과로 무수히 많은 브랜치가 올라가는데 gcc 4.5 브랜치는
gcc-4_5-branch

SVN으로 받았으나 configure에서 에러가 발생했는데 메시지 공부하고 있기도 그렇고 해서 그냥 릴리즈 를 받기로 했다.(이제와서 생각해보니 별 차이는 없었을 것 같다.)
경로 : ftp://ftp.dti.ad.jp/pub/lang/gcc/releases/gcc-4.5.0/
파일 : ftp://ftp.dti.ad.jp/pub/lang/gcc/releases/gcc-4.5.0/gcc-4.5.0.tar.gz

2전에 gawk가 있어야 한다.
apt-get install gawk

2. GMP 설치
gcc를 그냥 configure를 수행하면 아래와 같은 에러 메시지를 보게 된다.
 checking for the correct version of mpfr.h... no
configure: error: Building GCC requires GMP 4.2+, MPFR 2.3.1+ and MPC 0.8.0+.
Try the --with-gmp, --with-mpfr and/or --with-mpc options to specify
their locations.  Source code for these libraries can be found at
their respective hosting sites as well as at
ftp://gcc.gnu.org/pub/gcc/infrastructure/.  See also
http://gcc.gnu.org/install/prerequisites.html for additional info.  If
you obtained GMP, MPFR and/or MPC from a vendor distribution package,
make sure that you have installed both the libraries and the header
files.  They may be located in separate packages.
인터넷을 검색하면 GMP와 MPFR의 설치법이 나온다.

GMP 를 다운로드한다.
경로 : http://ftp.gnu.org/pub/gnu/gmp/
내가 받은 파일 : http://ftp.gnu.org/pub/gnu/gmp/gmp-5.0.1.tar.gz

압축을 해제하고 설치한다.
해당 폴더로 이동후
./configure --enable-cxx ( 이후 ppl 라이브러리가 이 인자를 요구했음 )
make install
하면 /usr/local 밑에 설치된다.

3. MPFR 설치
설명 : The MPFR library is a C library for multiple-precision floating-point computations with correct rounding.

MPFR을 다운로드한다.
경로 : http://www.mpfr.org/mpfr-current/
내가 받은 파일 : http://mpfr.loria.fr/mpfr-current/mpfr-3.0.0.tar.gz

압축을 해제하고 설치한다.
해당 폴더로 이동후
./configure
make install
하면 /usr/local 밑에 설치된다.(위에 적은 말 Ctrl+C / Ctrl +V)

4. MPC 설치
MPC를 설치한다.
경로 : http://www.multiprecision.org/
내가 받은 파일 : http://www.multiprecision.org/mpc/download/mpc-0.8.2.tar.gz

압축을 해제하고 설치한다.
해당 폴더로 이동후
./configure
make install
하면 /usr/local 밑에 설치된다.(위에 적은 말 Ctrl+C / Ctrl +V)

**. PPL 빌드(시도했으나 실패. 그리고 설치에 영향을 주지 않았음)
./configure --with-libgmp-prefix=/usr/local --with-libgmpxx-prefix=/usr/loca

5. gcc 빌드
./configure
make (쫄아서 make install 안하고 일단 make)
make install

6. 테스트
export PATH=/usr/local/bin:$PATH
gcc --version
아래와 같은 결과가 나오는 것을 확인할 수 있었다.

gcc (GCC) 4.5.0
Copyright (C) 2010 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.

허접한 글이지만, 도움이 되신다면 아래 손가락 꾹 눌러주세요.
신고

'프로그래밍 언어 > C/C++' 카테고리의 다른 글

C로 수행시간 체크하기  (0) 2010.09.30
__builtin_expect 키워드  (0) 2010.09.10
gcc 업그레이드 (4.5.0)  (0) 2010.07.21
Header안에 static 변수  (0) 2010.02.21
디버깅하는 법 - 툴 - ltrace  (0) 2010.02.18
unresolved symbol 에 관하여  (0) 2010.01.27
Posted by 소혼
이전버튼 1 이전버튼

티스토리 툴바