Linker magic for aliases an external symbol... how to?

Philip Prindeville philipp_subx@redfish-solutions.com
Thu Sep 1 19:45:00 GMT 2016


Hi.

I'm packaging a daemon (a Tacacs+ proxy for SSSD authentication, if 
anyone is interested) and using the libtac library.

I'm using an external packaging of libtac (as a .so) which was compiled 
with -DTACDEBUG_AT_RUNTIME=1 which had the net effect of causing the 
tracing macro TACDEBUG() to expand to:

#define TACDEBUG(level, format, ...) \
     do { if (tac_debug_enable) logmsg(level, format, ## __VA_ARGS__); } 
while (0)

problem is, the daemon doesn't provide the logmsg() function... but it 
does link to libc and hence provides syslog()... And yes, "level" 
corresponds to LOG_xxxx in <syslog.h> in the sources of the library.  
And no, I can't recompile or otherwise modify libtac.so I need to use it 
as is.

I've tried several different ways to specify at either compile time or 
link time that I want logmsg to be an alias to syslog().

I've tried in main.c:

void logmsg(int, const char *, ...)    asm("syslog");

and:

void logmsg(int, const char *, ...) __attribute__ ((weak, alias 
("syslog")));

as well as various link-time options like:

-Wl,--defsym=logmsg=syslog

as well as:

-Wl,-Map=ld.map

where ld.map contains:

SECTIONS {
   .text :
   {
       logmsg = syslog;

   }
}

I looked around on google, codebase, stackoverflow, etc. and couldn't 
find a solution to this problem (external library [libtac] referencing 
external symbol (logmsg) that I want to alias to an entry point (syslog) 
in another library, in this case libc).

With all of the options that gcc and ld provide, I was sure I'd be able 
to do this but now it's looking like I'll have to use objcopy to do some 
--redefine-sym magic...  but I'm not even sure I can do that since 
libtac is a shared-object library and I don't want to rewrite that...

Seems there's no good solution that I can find.  Can someone please tell 
me the correct way to resolve (no pun intended) this dilemma?

Thanks,

-Philip



More information about the Binutils mailing list