'GCC'에 해당되는 글 3건

아래 코드를 빌드하면

 
#include <stdio.h>
#include <sys/types.h>


int main(int argc, char *argv[])
{
    u_int64_t value1;
    
    value1 = 0xffffffffffffffff;
    
     return 0;
}


아래와 같이 빌드 에러 발생하게 됩니다.  


cc -Wall -Werror -Werror -std=gnu99 -c -o unused.o unused.c 
unused.c: In function ‘main’ 
unused.c:7:6: error: unused variable ‘value’ [-Werror=unused-variable] 
cc1: all warnings being treated as errors make: *** [unused.o] Error 1


이유는 ,  사용하지도 않으면서 value1 이라는 변수를 선언해 놓았기 때문인데, 보통은 Warnning 만 발생하지만 -Werror 옵션을 사용하면 기존의 Warnning 들을 모두 error 로 인식하기 때문입니다. 


가장 쉬운 해결 방법은, value1 이라는 변수를 사용하지 않는 것인데 아래와 같은 상황에서는 그렇기도 어렵습니다. 


#include <stdio.h>
#include <sys/types.h>

#define HAVE_PRINT

int main(int argc, char *argv[])
{
    u_int64_t value1;
    
    value1 = 0xffffffffffffffff;

#ifdef HAVE_PRINT
    printf("OUT : %lld\n", (long long unsigned int)value1);
#endif    
     return 0;
}

위와 같은 코드일경우, HAVE_PRINT 선언 상태에 따라서, value1 을 사용할 수도, 안할 수도 있으므로 무작정 value1 을 삭제할 수는 없습니다. 


그래서 아래와 같이 value1 에 속성을 주어서 선언하면 이런 문제를 해결할 수 있습니다. 



#include <stdio.h>
#include <sys/types.h>

#define HAVE_PRINT

int main(int argc, char *argv[])
{
    u_int64_t value1 __attribute__((unused));
    
    value1 = 0xffffffffffffffff;

#ifdef HAVE_PRINT
    printf("OUT : %lld\n", (long long unsigned int)value1);
#endif    
     return 0;
}


이렇게 하면 unused value 빌드 에러를 피할 수 있습니다. 단, 이 방법은 gnu 확장 문법이므로 다른 컴파일러 사용시에는 주의를 하셔야 합니다. 


'development' 카테고리의 다른 글

[linux] debug fs 사용법  (0) 2015.01.07
[driver] ipTime N150UA-4dBi  (8) 2014.09.16
[program] 32bit CPU 에서 64bit 변수 사용 문제  (0) 2013.07.25
[u-boot] RPC : sendmsg returned error 101  (0) 2013.07.19
[Kernel] Kbuild system  (0) 2013.07.12
블로그 이미지

김유석0

,

[GCC] -S 옵션?

development 2011. 11. 18. 11:58
아래와 같은 코드를 작성하였습니다.

test.c

#include <stdio.h>
int test(int i)
{
  printf("%d\n", i); return 0;
}

int main(int argc, char *argv[])
{
  int i;
  for(i=0;i<10;i++){
    test(i);
  }
  return 0;
}    
 
이 코드를 어셈블리 코드로 보고 싶다면?

gcc -S test.c    
 
-S 옵션을 붙여 주면 됩니다.
 
gcc -S test.c    
 
그럼 아래와 같이 어셈블리 코드로 볼 수 있습니다. 
 
    .file "test.c"
    .section .rodata
.LC0:
    .string "%d\n"
    .text
    .globl test
    .type test, @function
test:
.LFB0:
    .cfi_startproc
    pushl %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl %esp, %ebp
    .cfi_def_cfa_register 5
    subl $24, %esp
    movl $.LC0, %eax
    movl 8(%ebp), %edx
    movl %edx, 4(%esp)
    movl %eax, (%esp)
    call printf
    movl $0, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE0:
    .size test, .-test
    .globl main
    .type main, @function
main:
.LFB1:
    .cfi_startproc
    pushl %ebp
    .cfi_def_cfa_offset 8
    .cfi_offset 5, -8
    movl %esp, %ebp
    .cfi_def_cfa_register 5
    andl $-16, %esp
    subl $32, %esp
    movl $0, 28(%esp)
    jmp .L3
.L4:
    movl 28(%esp), %eax
    movl %eax, (%esp)
    call test
    addl $1, 28(%esp)
.L3:
    cmpl $9, 28(%esp)
    jle .L4
    movl $0, %eax
    leave
    .cfi_restore 5
    .cfi_def_cfa 4, 4
    ret
    .cfi_endproc
.LFE1:
    .size main, .-main
    .ident "GCC: (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1"
    .section .note.GNU-stack,"",@progbits
 
참고로 전 어셈코드를 못 봅니다. 능력이 안됩니다.
 
블로그 이미지

김유석0

,

GCC on-line

development 2011. 9. 22. 09:20
GCC on-line 입니다. 

http://gcc.gnu.org/onlinedocs/

 

 

'development' 카테고리의 다른 글

[linux kernel]Scatter list  (1) 2011.09.27
[HW] TTL 과 RS232 에 대한 정리  (0) 2011.09.26
[HW] TTL Level 과 CMOS Level  (0) 2011.09.26
[crypto] IPSec  (0) 2011.09.23
GDB  (4) 2011.01.05
블로그 이미지

김유석0

,