Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to check macros defined in .so? I'd use nm to check the function, is there a way to do the same for macros?

Tags:

c

linux

nm

.so

I have a code like this in mylib.h, and then I use it to create mylib.so. Is there a way to check how MY_MACROS is defined in .so?

#ifdef SWITCH_CONDITION
    #define MY_MACROS       0
#else
    #define MY_MACROS       1
#endif

If that would be a function, I'd simply do

nm mylib.so | grep myfunction

Is there a way to do the same for macros?

P.S. There should be because of

> grep MY_MACROS mylib.so 
> Binary file mylib.so matches
like image 216
tkrishtop Avatar asked Jan 25 '23 21:01

tkrishtop


1 Answers

In general there is no way to do this sort of thing for macros. (But see more below.)

Preprocessor macros are theoretically a compile-time concept. In fact, in the early implementations of C, the preprocessor was -- literally -- a separate program, running in a separate process, converting C code with #include and #define and #ifdef into C code without them. The actual C compiler saw only the "preprocessed" code.

Now, theoretically a compiler could somehow save away some record of macro definitions, perhaps to aid in debugging. I wasn't aware of any that did this, although evidently those using the DWARF format actually do! See comments below, and this answer.

You can always write your own, explicit code to track the definition of certain macros. For example, I've often written code elong the lines of

void print_version()
{
    printf("myprogram version %s", VERSION_STRING);
#ifdef DEBUG
    printf(" (debug version)");
#endif
    printf("\n");
}

Some projects have rather elaborate mechanisms to keep track of the compilation switches which are in effect for a particular build. For example, in projects managed by a configure script, there's often a single file config.status containing one single record of all the compilation options, for posterity.

like image 186
Steve Summit Avatar answered Feb 15 '23 05:02

Steve Summit