오브젝트 파일의 printf 를 막을수 있는 방법이 있나요?
글쓴이: overcrash / 작성시간: 화, 2014/01/14 - 9:17오전
안녕하세요.
리눅스 기반 소프트웨어를 개발하는 사람입니다.
최근 거래처로부터, 특정 chip 을 제어할 수 있는 API 를 .o 파일로 제공받았습니다.
그런데, 그 .o 파일을 포함해서 컴파일 후 실행 해 보면,
쓸데없는 printf 가 너무 많이 뜨네요.
소스코드를 요청했지만, 공개할 수 없다고 해서 난감한데요.
.o 파일 내의 printf 를 컴파일 시에 막을 수 있는 방법이 있을까요?
예를들면
gcc -o main_ex aaa.c bbb.c ccc.o
이런식으로 컴파일 하는데요, 마지막껀 거래처에서 받은 .o 파일입니다.
저 .o 파일에서 나오는 printf 만 막고 싶습니다.
다른 우리쪽 소스코드의 printf는 정상적으로 출력되야 하구요.
관련해서 방법이 있으면 공유 부탁드립니다.
감사합니다.
Forums:
음 ..
stdout 을 닫아 버리고, overcrash 님의 코드에서 stderr 나 file 로 빼는 수 밖에 없어 보이네요.
디버깅 메시지는 간단하게나마 별도로 printf 대신 함수나 매크로를 만들어 두면 편합니다.
이런때 간단히 출력 방향을 바꿀 수도 있고, 모듈이나 레벨별로 분리해서 써 먹을 수도 있으니까요.
되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』
static link 되어있으면 디스어셈블해서 콜하는
static link 되어있으면 디스어셈블해서 콜하는 부분을 수정하는수밖에 없고요 다이나믹이라면 printf 새로 정의해서 쓰면 될것같은데요...?
printf는 표준 C라이브러리에 포함되어있으므로
printf는 표준 C라이브러리에 포함되어있으므로 이를 새로 정의해버리면 중복 정의로 링크가 안될거같네요.
표준라이브러리도 그냥 라이브러리인데 gcc에서
표준라이브러리도 그냥 라이브러리인데 gcc에서 명시적으로 -lglibc를 안써도 되게 해놓은걸로 알고있습니다.
http://stackoverflow.com/questions/10763394/how-to-build-a-c-program-using-a-custom-version-of-glibc
glibc소스 받아서 printf만 수정해서 링크하면 될것같네요. 물론 받은 소스 말고 기존에 있는 소스는 원래 glibc를 이용해야하니 좀 복잡하긴 하겠죠.
----- 1.h
초보적이기는 합니다만 이런 식으로 할 수 있지 않을까요.
dummy printf 파일을 만듭니다. /*
dummy printf 파일을 만듭니다.
컴파일하여 오브젝트 파일로 만듭니다.
원래의 오브젝트 파일과 링크합니다.
printf 심볼을 지역화합니다.
ccc.o 대신 ccc.merged.localized.o를 링크합니다.
질문자는 아니지만 감사합니다. objcopy라는
질문자는 아니지만 감사합니다.
objcopy라는 녀석이 있었군요!
유용하게 쓸 수 있을 것 같습니다.
많은 답변들 감사드립니다.
질문자입니다.
짧은 시간내에 많은 분들이 다양한 노하우를 공유해 주셨네요.
소중한 의견들 감사드립니다.
kukyakya 님의 방법이 가장 깔끔해 보이네요.^^
감사합니다~ (__)
댓글 달기