How get list of functions in current C program

Discussion in 'C Programming' started by Ali Shirvani, Nov 17, 2008.

  1. Ali Shirvani

    Ali Shirvani Guest

    Hi all,
    I want to get list of all functions that are defined in the current C
    code, for example if I have the code below:

    int f(int c, int d){
    int a = 10;
    int b = 12;
    return c+a;
    }

    int g(void){
    ...
    ...
    }

    int main(){
    }


    I need a function that give me *f* and *g*.

    thanks,
    --
    Shirvani Ali
    Ali Shirvani, Nov 17, 2008
    #1
    1. Advertising

  2. Ali Shirvani

    Guest

    On Nov 17, 2:05 pm, Ali Shirvani <> wrote:
    > Hi all,
    > I want to get list of all functions that are defined in the current C
    > code, for example if I have the code below:
    >
    > int f(int c, int d){
    >    int a = 10;
    >    int b = 12;
    >    return c+a;
    >
    > }
    >
    > int g(void){
    >    ...
    >    ...
    >
    > }
    >
    > int main(){
    >
    > }
    >
    > I need a function that give me *f* and *g*.
    >
    > thanks,


    void get_f_and_g(int (**f_result)(int c, int d),
    int (**g_result)(void))
    {
    *f_result = f; // f and g need to be in scope, of course
    *g_result = g;
    }

    Sebastian
    , Nov 17, 2008
    #2
    1. Advertising

  3. Ali Shirvani

    Ali Shirvani Guest

    On Nov 17, 10:30 pm, (Gordon Burditt) wrote:
    > >I want to get list of all functions that are defined in the current C
    > >code, for example if I have the code below:

    >
    > There are a number of tools that operate on source code and will
    > give you information like this.  "cproto", for example, will give
    > you a list of prototypes for the external functions.  (and, of
    > course, those include the function names).  These depend on being
    > able to read C source code as a text file, and are fairly portable.
    > Some of them invoke the C preprocessor, which isn't portable.  Some
    > of those that don't invoke the C preprocessor can get confused by
    > macros used in defining functions.
    >
    > An executable or object file may also contain the function names
    > (if not stripped) mangled appropriately (some implementations add
    > a leading underscore or make other changes to the name to avoid
    > assembler keywords.  In C++ the function name may be horribly mangled
    > to indicate argument and return types.).  Tools such as "nm" or
    > "objdump" may be available.  It is common that there is a symbol
    > "type" that allows you to distinguish between functions and variables,
    > and to identify static vs. non-static names.  This is all very
    > system-dependent.
    >
    > There is no guarantee that a running executable can find its own
    > name accurately, and if it does, that it can open up the executable
    > to look at the symbols.  And, of course, looking at the symbols is
    > very system-dependent.
    >
    >
    >
    > >int f(int c, int d){
    > >   int a = 10;
    > >   int b = 12;
    > >   return c+a;
    > >}

    >
    > >int g(void){
    > >   ...
    > >   ...
    > >}

    >
    > >int main(){
    > >}

    >
    > >I need a function that give me *f* and *g*.

    >
    > Is there any particular reason why this function should *NOT* also
    > give you "main", "printf", "exit", "getchar", etc. ?


    Thanks for your reply.
    I'm on Linux, and I want to get only the functions that I wrote them,
    there is no problem, if any thing give me list of all function, I can
    ignore some of them. Is there any library that work like *nm*?

    Thanks
    Ali Shirvani, Nov 17, 2008
    #3
  4. Ali Shirvani

    CBFalconer Guest

    Ali Shirvani wrote:
    >
    > I want to get list of all functions that are defined in the
    > current C code, for example if I have the code below:
    >
    > int f(int c, int d){
    > int a = 10;
    > int b = 12;
    > return c+a;
    > }
    >
    > int g(void){
    > ...
    > }
    >
    > int main(){
    > }
    >
    > I need a function that give me *f* and *g*.


    Simple. You parse the source code, and whenever you find a
    definition for a function you extract and spit out that function
    name. You might find it simpler to just read the source.

    --
    [mail]: Chuck F (cbfalconer at maineline dot net)
    [page]: <http://cbfalconer.home.att.net>
    Try the download section.
    CBFalconer, Nov 17, 2008
    #4
  5. Ali Shirvani

    Ali Shirvani Guest

    On Nov 18, 3:58 am, (Gordon Burditt) wrote:
    > >> >I need a function that give me *f* and *g*.

    >
    > >> Is there any particular reason why this function should *NOT* also
    > >> give you "main", "printf", "exit", "getchar", etc. ?

    >
    > >Thanks for your reply.
    > >I'm on Linux, and I want to get only the functions that I wrote them,

    >
    > So you didn't write main()?
    >
    > >there is no problem, if any thing give me list of all function, I can
    > >ignore some of them. Is there any library that work like *nm*?

    >
    > You have the source code to nm, so go ahead and modify a copy of
    > it so instead of outputting a list of symbols, it selects appropriate
    > ones and returns a list of them to the caller.


    I want do this on process, but nm do this on program, not process!
    Ali Shirvani, Nov 18, 2008
    #5
  6. This is more appropriate for comp.unix.programmer; crossposted and
    followups to there.

    Ali Shirvani <> writes:

    > On Nov 18, 3:58 am, (Gordon Burditt) wrote:
    >> >> >I need a function that give me *f* and *g*.

    >>
    >> >> Is there any particular reason why this function should *NOT* also
    >> >> give you "main", "printf", "exit", "getchar", etc. ?

    >>
    >> >Thanks for your reply.
    >> >I'm on Linux, and I want to get only the functions that I wrote them,

    >>
    >> So you didn't write main()?
    >>
    >> >there is no problem, if any thing give me list of all function, I can
    >> >ignore some of them. Is there any library that work like *nm*?

    >>
    >> You have the source code to nm, so go ahead and modify a copy of
    >> it so instead of outputting a list of symbols, it selects appropriate
    >> ones and returns a list of them to the caller.

    >
    > I want do this on process, but nm do this on program, not process!


    As far as I know, this is impossible. The names of your functions might
    be stored in your program's binary, if it hasn't been stripped; but they
    are certainly not loaded into your process's memory. By that time,
    everything's been converted to raw addresses and the names are no longer
    needed. So there is no way to get to them at runtime short of reading
    the binary (which you could do with nm) or some other file where they
    might be stored.

    Why do you want to do this, anyway? Maybe there is a better way to
    solve your underlying problem.
    Nate Eldredge, Nov 18, 2008
    #6
  7. Ali Shirvani

    James Harris Guest

    On 18 Nov, 05:12, Ali Shirvani <> wrote:
    > On Nov 18, 3:58 am, (Gordon Burditt) wrote:
    >
    >
    >
    > > >> >I need a function that give me *f* and *g*.

    >
    > > >> Is there any particular reason why this function should *NOT* also
    > > >> give you "main", "printf", "exit", "getchar", etc. ?

    >
    > > >Thanks for your reply.
    > > >I'm on Linux, and I want to get only the functions that I wrote them,

    >
    > > So you didn't write main()?

    >
    > > >there is no problem, if any thing give me list of all function, I can
    > > >ignore some of them. Is there any library that work like *nm*?

    >
    > > You have the source code to nm, so go ahead and modify a copy of
    > > it so instead of outputting a list of symbols, it selects appropriate
    > > ones and returns a list of them to the caller.

    >
    > I want do this on process, but nm do this on program, not process!


    I've looked at your three messages and am not clear: Do you want to
    get these names from the source code - i.e. by scanning the C source -
    or from the running process - i.e. to find out while executing what
    functions are present?

    --
    James
    James Harris, Nov 18, 2008
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Manu
    Replies:
    1
    Views:
    6,066
    Natty Gur
    Jul 20, 2003
  2. Xiangliang Meng
    Replies:
    1
    Views:
    1,570
    Victor Bazarov
    Jun 21, 2004
  3. Abby
    Replies:
    1
    Views:
    477
    Jack Klein
    Aug 29, 2003
  4. Fernando Rodriguez
    Replies:
    3
    Views:
    311
    David Eppstein
    Nov 21, 2003
  5. James E Keenan
    Replies:
    2
    Views:
    120
    James E Keenan
    Nov 15, 2005
Loading...

Share This Page