Hey,
Ben sinds een korte tijd bezig met een applicatie van mij te porten naar linux en loop tegen een probleem aan waar ik niet uit kom.
Ik heb een main programma (Server.x86) een een shared module (Bin/Framework.x86.so), in mijn main prog export ik een symbol (g_SharedData) die ik in de opstart code van de module wil resolven via dlsym(NULL, "SharedData").
Maar dat lukt dus niet, hier wat meer info:
alex@sles:~/dev/Hellhound/Build> objdump --syms Server.x86 | grep -i shared
0804d4f0 l F .text 0000000c _GLOBAL__I_g_pSharedData
08053be0 g O .bss 000000c8 g_SharedData
08053bc0 g O .bss 00000004 .hidden g_pSharedData
alex@sles:~/dev/Hellhound/Build> objdump --syms Bin/Framework.x86.so | grep -i shared
00006d00 l F .text 0000000c _GLOBAL__I_g_pSharedData
0000fb20 l O .bss 00000004 .hidden g_pSharedData
0000fb40 g O .bss 000000c8 g_SharedData
Zo als je hier boven kan zien word de symbol in beide ge-export, maar omdat de Server.x86 eerder word geladen word deze eerst bekeken voor symbols.
Als ik dan met LD_DEBUG=all de prog opstart dan krijg ik op een gegeven ogenblik de volgende output:
16233: symbol=g_SharedData; lookup in file=./Server.x86 [0]
16233: symbol=g_SharedData; lookup in file=/lib/libpthread.so.0 [0]
16233: symbol=g_SharedData; lookup in file=/lib/libdl.so.2 [0]
16233: symbol=g_SharedData; lookup in file=/lib/libc.so.6 [0]
16233: symbol=g_SharedData; lookup in file=/lib/ld-linux.so.2 [0]
16233: symbol=g_SharedData; lookup in file=Bin/Framework.x86.so [0]
16233: binding file Bin/Framework.x86.so [0] to Bin/Framework.x86.so [0]: normal symbol `g_SharedData'
Zo als je kan zien kijkt hij wel naar Server.x86 maar vind de symbol daar niet?!?!?
Ik heb diverse dingen geprobeerd:
- In Bin/Framework.x86.so de symbol weg gehaalt, dan komt ld_debug met de melding dat hij hem helemaal niet kan vinden
- Opstarten via absolute path (dan zie je ook met ld_debug het complete path staan), werkt ook niet.
- Symbol in andere sections gezet, werkt ook niet
- En nog veel meer, ben het alweer vergeten wat ik allemaal gedaan heb.
Dit lijkt mij eigenlijk op een bug van libld (of de ld code in libc), op windows heb ik dit wel werkend (maar dan wel via GetProcAddress natuurlijk).
Heeft iemand een idee? Of weet iemand waar ik dit het beste kan vragen?
Ben sinds een korte tijd bezig met een applicatie van mij te porten naar linux en loop tegen een probleem aan waar ik niet uit kom.
Ik heb een main programma (Server.x86) een een shared module (Bin/Framework.x86.so), in mijn main prog export ik een symbol (g_SharedData) die ik in de opstart code van de module wil resolven via dlsym(NULL, "SharedData").
Maar dat lukt dus niet, hier wat meer info:
alex@sles:~/dev/Hellhound/Build> objdump --syms Server.x86 | grep -i shared
0804d4f0 l F .text 0000000c _GLOBAL__I_g_pSharedData
08053be0 g O .bss 000000c8 g_SharedData
08053bc0 g O .bss 00000004 .hidden g_pSharedData
alex@sles:~/dev/Hellhound/Build> objdump --syms Bin/Framework.x86.so | grep -i shared
00006d00 l F .text 0000000c _GLOBAL__I_g_pSharedData
0000fb20 l O .bss 00000004 .hidden g_pSharedData
0000fb40 g O .bss 000000c8 g_SharedData
Zo als je hier boven kan zien word de symbol in beide ge-export, maar omdat de Server.x86 eerder word geladen word deze eerst bekeken voor symbols.
Als ik dan met LD_DEBUG=all de prog opstart dan krijg ik op een gegeven ogenblik de volgende output:
16233: symbol=g_SharedData; lookup in file=./Server.x86 [0]
16233: symbol=g_SharedData; lookup in file=/lib/libpthread.so.0 [0]
16233: symbol=g_SharedData; lookup in file=/lib/libdl.so.2 [0]
16233: symbol=g_SharedData; lookup in file=/lib/libc.so.6 [0]
16233: symbol=g_SharedData; lookup in file=/lib/ld-linux.so.2 [0]
16233: symbol=g_SharedData; lookup in file=Bin/Framework.x86.so [0]
16233: binding file Bin/Framework.x86.so [0] to Bin/Framework.x86.so [0]: normal symbol `g_SharedData'
Zo als je kan zien kijkt hij wel naar Server.x86 maar vind de symbol daar niet?!?!?
Ik heb diverse dingen geprobeerd:
- In Bin/Framework.x86.so de symbol weg gehaalt, dan komt ld_debug met de melding dat hij hem helemaal niet kan vinden
- Opstarten via absolute path (dan zie je ook met ld_debug het complete path staan), werkt ook niet.
- Symbol in andere sections gezet, werkt ook niet
- En nog veel meer, ben het alweer vergeten wat ik allemaal gedaan heb.
Dit lijkt mij eigenlijk op een bug van libld (of de ld code in libc), op windows heb ik dit wel werkend (maar dan wel via GetProcAddress natuurlijk).
Heeft iemand een idee? Of weet iemand waar ik dit het beste kan vragen?