Probleme und Lösungen zu Zeichenkonflikten unter Linux

零下一度
Freigeben: 2017-06-17 10:59:18
Original
1800 Leute haben es durchsucht

In diesem Artikel werden hauptsächlich relevante Informationen zur Lösung des Problems widersprüchlicher Symbole mit demselben Namen unter Linux vorgestellt. Freunde, die sie benötigen, können sich auf

Lösung für das Problem widersprüchlicher Symbole mit dem beziehen Gleicher Name unter Linux

Ich bin kürzlich bei der Arbeit auf das folgende lästige Problem gestoßen:

Unter Linux gibt es drei Module aa, bb und cc. Die Grundsituation ist wie folgt:

cc ​​​​Kompilieren und verbinden, um eine dynamische Bibliothek zu erhalten. Es gibt die folgenden Schnittstellen in cc:


cc_fun 
{ 
…… 
do();//调用名为do的cc模块内部函数 
…… 
}
Nach dem Login kopieren

bb kompilieren und verbinden, um bb.a statische-Bibliothek zu erhalten. Es gibt die folgenden Schnittstellen in bb:


bb_fun 
{ 
…… 
handle = dlopen(cc.so, RTLD_LAZY);//加载cc.so 
pccfun = dlsym(handle, “cc_fun”);//获取cc_fun函数指针 
(*pccfun)();//调用cc_fun函数,此时应该会调用cc模块中的do()函数 
do();//调用名为do的bb模块内部函数(与cc模块中的do()函数同名,实现却不相同) 
…… 
}
Nach dem Login kopieren

aa Nach der Kompilierung eine Verbindung herstellen bb.a ruft über die Link-Option -lbb das ausführbare aa-Programm ab und ruft die Schnittstellenfunktion bb_fun() von bb.a auf:


main 
{ 
…… 
bb_fun();//调用bb_fun函数 
…… 
}
Nach dem Login kopieren

Während der Arbeit Es wurde festgestellt, dass sich aa zur Laufzeit ungewöhnlich verhält und es immer zu Speicherverlusten und Funktionsstörungen kommt. Es wurde festgestellt, dass sich das Problem auf die gleichnamige Funktion do() konzentriert. Beim Drucken der Ausgabe wurde festgestellt, dass die beiden Aufrufe der Funktion do () im Programm beide die Funktion do () im Modul bb aufriefen, während die Funktion do () im Modul cc nie aufgerufen wurde, was zu einer Abnormalität führte Programmverhalten und Speicherlecks. Nach mehreren Überprüfungen habe ich erfahren, dass die Symboltabellen in jeder Bibliothek im Linux-Programm schließlich in die globale Symboltabelle geladen werden, in der sich das Programm zu diesem Zeitpunkt befindet, wenn es ein Symbol mit dem gibt Bei gleichem Namen kann nur das zuerst geladene Symbol aufgerufen werden, d. h. später geladene Symbole mit demselben Namen werden durch die vorherigen überschrieben. Die Funktion do() im cc-Modul wird durch die Funktion do() im bb-Modul überschrieben und kann daher nicht aufgerufen werden.

Kein Unsinn mehr. . .

Nachdem Sie viele unbefriedigende Methoden ausprobiert haben, lautet die endgültige Lösung wie folgt:

1. Fügen Sie -Wl, -Bsymbolic -Wl zum cc-Makefile hinzu -script, die Verbindungsoption der Version, bedeutet, das Skript in der Versionsdatei zu verwenden, um anzugeben, welche Funktionen exportiert werden.

2.version-Datei wird wie folgt implementiert:


bedeutet, dass das cc-Modul so angegeben ist, dass es nur die Schnittstellenfunktion cc_fun exportiert, und die Andere Funktionen sind auf „Lokal“ eingestellt.
VERS{ 
global: 
cc_fun; 
local: *; 
};
Nach dem Login kopieren

Speichern Sie die Datei in dem Verzeichnis, in dem sich das Makefile befindet.

3. Kompilieren und verbinden Sie die drei Module und das Problem ist gelöst.

Das obige ist der detaillierte Inhalt vonProbleme und Lösungen zu Zeichenkonflikten unter Linux. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage