This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
Thank you for informative answer. I know about "objcopy --redefine-sym", it can't be applied here.The fact is that in general main.o may need to be linked with several *.so files. And these *.so files may have name conflicts (export different symbols under the same name). That's actually the main reason why linking with a symbols under different names seems to be must-have feature.
For example:I'm given main.o (with unresolved symbols: symbolA, symbolB, symbolC1, symbolC2, symbolD, symbolE).
I'm given libused.o (with exported symbols: symbolA, symbolB, symbolC).
I'm given libsecond.o (with exported symbols: symbolC, symbolD, symbolE).
I'm given recipe:- map symbolA (from main.o) to symbolA (from libused.so) [names coincide]; - map symbolB (from main.o) to symbolB (from libused.so) [names coincide]; - map symbolC1 (from main.o) to symbolC (from libused.so) [names differ]; - map symbolC2 (from main.o) to symbolC (but from libsecond.so) [names differ]; - map symbolD (from main.o) to symbolD (from libsecond.so) [names coincide]; - map symbolE (from main.o) to symbolE (from libsecond.so) [names coincide].
[Note that libused.so and libsecond.so both export symbolC.]So, applying "objcopy --redefine-sym" to main.o is possible, but it doesn't solve name conflict and thus doesn't help here. While applying "objcopy --redefine-sym" to *.so files isn't possible at all, because: (1) it would be different shared library, while linking to original is required; (2) objcopy doesn't work with dynamic symbols (it affects output of "objdump -t", not "objdump -T").
Anyway, thanks for your answer. It could be very helpful if libused and libsecond were static libraries (*.a), not shared (*.so). That's actually the way I use to solve the same problem with static libraries.
[Sorry for duplicate, first reply was accidentally sent to wrong address.] On 08.10.16 17:23, Rayson Ho wrote:
Sasha , Did you try the objcopy command's "--redefine-sym" option?? --redefine-sym old=new Change the name of a symbol old, to new. This can be useful when one is trying link two things together for which you have no source, and there are name collisions See: https://sourceware.org/binutils/docs/binutils/objcopy.html Rayson ================================================== Open Grid Scheduler - The Official Open Source Grid Engine http://gridscheduler.sourceforge.net/ http://gridscheduler.sourceforge.net/GridEngine/GridEngineCloud.htmlOn Sat, Oct 8, 2016 at 7:06 AM, Sasha Unknown <sasha2048@gmail.com> wrote:It's even more complex. I actually don't have any info about what that symbol is and what convention it follows (except output of objdump, of course). The full task is probably like that: I'm given main.o (with some unresolved symbols). I'm given libused.so (with some exported symbols). I'm given recipe, like: - map symbol1 (from main.o) to symbol1 (from libused.so) [names coincide]; - map symbol2 (from main.o) to symbol2 (from libused.so) [names coincide]; - map symbol3 (from main.o) to symbol862 (from libused.so) [names differ];- map symbol4 (from main.o) to symbol5837 (from libused.so) [namesdiffer]; - map symbol5 (from main.o) to symbol5 (from libused.so) [names coincide]; - ... How?[Sorry for duplicate, first reply was accidentally sent to wrong address.]On 06.10.16 23:00, Sasha Unknown wrote:Hello.1. This is possible only with function. If it's a variable, I can't create "wrapper variable" for it. (E.g. if symbol2 is "int" variable, I of course can create foo.c with "int * const symbol1 = &symbol2", but this won't match symbol1 convention from main.o, which expects symbol1 to be "int", not "int*".) 2. Even with function this gives some overhead (one additional call; AFAIK, wrapper function won't be inlined in this case). Thanks. On 06.10.16 15:58, Nick Clifton wrote:Hi Sasha,Suppose I have: - compiled object file "main.o" with unresolved symbol "symbol1"; - build shared library "libused.so" with exported symbol "symbol2".Is there way to somehow link program "main" from "main.o", telling it touse "symbol2" from "libused.so" as "symbol1"?Why not create a foo.c file that defines symbol1 and then passes any reference on to symbol2 ? Cheers Nick
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |