오브젝트 파일의 printf 를 막을수 있는 방법이 있나요?

overcrash의 이미지

안녕하세요.
리눅스 기반 소프트웨어를 개발하는 사람입니다.

최근 거래처로부터, 특정 chip 을 제어할 수 있는 API 를 .o 파일로 제공받았습니다.
그런데, 그 .o 파일을 포함해서 컴파일 후 실행 해 보면,
쓸데없는 printf 가 너무 많이 뜨네요.

소스코드를 요청했지만, 공개할 수 없다고 해서 난감한데요.
.o 파일 내의 printf 를 컴파일 시에 막을 수 있는 방법이 있을까요?

예를들면
gcc -o main_ex aaa.c bbb.c ccc.o

이런식으로 컴파일 하는데요, 마지막껀 거래처에서 받은 .o 파일입니다.
저 .o 파일에서 나오는 printf 만 막고 싶습니다.
다른 우리쪽 소스코드의 printf는 정상적으로 출력되야 하구요.

관련해서 방법이 있으면 공유 부탁드립니다.
감사합니다.

ymir의 이미지

stdout 을 닫아 버리고, overcrash 님의 코드에서 stderr 나 file 로 빼는 수 밖에 없어 보이네요.

#define printf(...)  fprintf(stderr, __VA_ARGS__)

디버깅 메시지는 간단하게나마 별도로 printf 대신 함수나 매크로를 만들어 두면 편합니다.
이런때 간단히 출력 방향을 바꿀 수도 있고, 모듈이나 레벨별로 분리해서 써 먹을 수도 있으니까요.

되면 한다! / feel no sorrow, feel no pain, feel no hurt, there's nothing gained.. only love will then remain.. 『 Mizz 』

kaeri17의 이미지

static link 되어있으면 디스어셈블해서 콜하는 부분을 수정하는수밖에 없고요 다이나믹이라면 printf 새로 정의해서 쓰면 될것같은데요...?

klara의 이미지

printf는 표준 C라이브러리에 포함되어있으므로 이를 새로 정의해버리면 중복 정의로 링크가 안될거같네요.

익명 사용자의 이미지

표준라이브러리도 그냥 라이브러리인데 gcc에서 명시적으로 -lglibc를 안써도 되게 해놓은걸로 알고있습니다.
http://stackoverflow.com/questions/10763394/how-to-build-a-c-program-using-a-custom-version-of-glibc
glibc소스 받아서 printf만 수정해서 링크하면 될것같네요. 물론 받은 소스 말고 기존에 있는 소스는 원래 glibc를 이용해야하니 좀 복잡하긴 하겠죠.

익명 사용자의 이미지

----- 1.h --------------------
extern int f1(int in);
extern int f2(int in);
 
----- 1.c --------------------
#include <stdio.h>
 
extern int f1(int in)
{
    printf("== %d\n", in);
 
    return in + 1;
}
 
extern int f2(int in)
{
    printf("++ %d\n", in);
 
    return in + 2;
}
 
----- 2.c --------------------
#include <stdio.h>
 
#include "1.h"
 
void print_(void)
{
}
 
int main(int argc, char *argv[])
{
    printf("%d %d\n", f1(1), f2(1));
 
    return 0;
}

$ gcc -c 1.c
$ gcc 1.o 2.c
$ ./a.out
++ 1
== 1
2 3
$ hexdump -C 1.o | grep printf
00000440  00 31 2e 63 00 66 31 00  70 72 69 6e 74 66 00 66  |.1.c.f1.printf.f|
$
$ # 여기서 hexedit로 1.o의 저 printf를 print_ 로 바꿈
$
$ hexdump -C 1.o | grep print_
00000440  00 31 2e 63 00 66 31 00  70 72 69 6e 74 5f 00 66  |.1.c.f1.print_.f|
$ gcc 1.o 2.c
$ ./a.out
2 3
$

초보적이기는 합니다만 이런 식으로 할 수 있지 않을까요.

kukyakya의 이미지

dummy printf 파일을 만듭니다.

/* printf.c */
int printf()
{
    return 0;
}

컴파일하여 오브젝트 파일로 만듭니다.

$ gcc -c printf.c

원래의 오브젝트 파일과 링크합니다.

$ ld -r ccc.o printf.o -o ccc.merged.o

printf 심볼을 지역화합니다.

$ objcopy --localize-symbol=printf ccc.merged.o ccc.merged.localized.o

ccc.o 대신 ccc.merged.localized.o를 링크합니다.

$ gcc -o main_ex aaa.c bbb.c ccc.merged.localized.o
익명 사용자의 이미지

질문자는 아니지만 감사합니다.
objcopy라는 녀석이 있었군요!
유용하게 쓸 수 있을 것 같습니다.

overcrash의 이미지

질문자입니다.
짧은 시간내에 많은 분들이 다양한 노하우를 공유해 주셨네요.
소중한 의견들 감사드립니다.
kukyakya 님의 방법이 가장 깔끔해 보이네요.^^
감사합니다~ (__)

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.