Forum: Mikrocontroller und Digitale Elektronik Externe Symbole in statisch gelinker Bibliothek möglich


von turboLoader (Gast)


Lesenswert?

Der Normalfall:
In den Objects sind externe Symbole (Platzhalter), diese werden vom 
Linker aufgelöst und mit echten Speicher-Adressen ersetzt.

Z.B.

call mod_A_function_1
call mod_B_function_1

nach dem Linken:

call 0xAE0064
call 0xAE0164


Nun der Spezialfall:
Ich möchte bestimmte externe Symbole im ersten Linkvorgang unbestimmt 
belassen und andere auflösen.

Z.B.

call mod_A_function_1
call mod_B_function_1

nach dem Linken:

call 0xAE0064
call mod_B_function_1 (extern)


In einem zweiten Linkvorgang sollten dann die externen Symbole aufgelöst 
werden.

Hintergrund:
Ich möchte statt gegen einzelne Objects zu linken gegen eine vorgelinkte 
Lib linken, welche nur noch die Symbole enthält, die auch meine Lib 
betreffen.

Konkret geht es hier um Know-How Schutz. Offiziell darf ich die 
einzelnen Objects meines Parterns nicht mehr erhalten - eine Alternative 
Möglichkeit wäre das vorgeschlagene Verfahren.

Nun meine Frage:
Ist dies überhaupt möglich? Und falls ja, gibt es dafür einen 
Fachausdruck?

Danke Euch!

von buchmannssepp (Gast)


Lesenswert?

Servus

würde mich auch interessieren.

push

Grüße aus Niederbayern

von Sven P. (Gast)


Lesenswert?

turboLoader schrieb:
> In einem zweiten Linkvorgang sollten dann die externen Symbole aufgelöst
> werden.
Das machst du doch ständig.

Wenn dein Projekt aus mehreren Modulen besteht, werden die jeweils in 
einzelne Objekte übersetzt. Anschließend werden die Objekte deines 
Projektes statisch zusammengelinkt. Was bis dahin auflösbar ist, wird 
auch aufgelöst.

Es steht dir natürlich frei, einzelne dieser Objekte vorab schonmal zu 
größeren Objekten zusammenzulinken. Oder mehrere Objekte zusammen in 
eine statische Bibliothek zusammenzuziehen (üblicherweise mit dem 
Archiver 'ar').

Den Rest, also faktisch externe Symbole, werden beim Programmstart vom 
dynamischen Linker aufgelöst.

von Reinhard Kern (Gast)


Lesenswert?

turboLoader schrieb:
> Ich möchte bestimmte externe Symbole im ersten Linkvorgang unbestimmt
> belassen und andere auflösen.

Ich bin nicht sicher, ob ich das richtig verstehe, aber ist das nicht 
der normale Vorgang einer Library-Erstellung? Man linkt eine Reihe von 
Modulen zusammen, dabei wird aufgelöst was eben auflösbar ist und der 
Rest bleibt extern. Das Ergebnis wird als Library gespeichert. Den 
Vorgang kann man beliebig wiederholen, möglicherweise ist dazu eine 
Software nötig, die die Bezeichnung "Librarian" oder so trägt.

Aber auch mit dem Linker müsste es möglich sein, eine Library und einige 
Module zusammenzulinken und das Ergebnis wieder als Library zu 
verwenden.

Gruss Reinhard

von turboLoader (Gast)


Lesenswert?

Hallo Sven P.,
Hallo Reinhard,

schon mal vielen Dank für eure Antworten.

>Das machst du doch ständig.

>Wenn dein Projekt aus mehreren Modulen besteht, werden die jeweils in
>einzelne Objekte übersetzt. Anschließend werden die Objekte deines
>Projektes statisch zusammengelinkt. Was bis dahin auflösbar ist, wird
>auch aufgelöst.

>Es steht dir natürlich frei, einzelne dieser Objekte vorab schonmal zu
>größeren Objekten zusammenzulinken. Oder mehrere Objekte zusammen in
>eine statische Bibliothek zusammenzuziehen (üblicherweise mit dem
>Archiver 'ar').

Genau, mir geht es darum, dass die Vorab-Version ("Fremd-Lib") schon mal 
auf echte Memory Adressen statisch gelinkt wurde ... Die 
"Einsprungadressen" in der Lib zu "meinen" Funktionen (in meiner Lib) 
sollen dann aufgelöst werden.

Vielleicht ist es noch etwas abstrakt was ich möchte bzw. definieren 
will ...

Früher war es so, dass wir vom Zulieferer Objects erhalten und unsere 
Lib in einem finalen Gesamt-Build zusammen gefügt haben.

Dies geht aus Know-How Schutz Gründen von unserem Zulieferer nun nicht 
mehr, da er Angst davor hat, dass wir seine Lib reverse-engineeren. Nun 
versuche ich einen Gegenvorschlag zu definieren, wie wir dennoch diesen 
"Gesamt-Build" selbst ausführen könnten. Der Vorschlag des Zulieferers 
ist es, dass nur noch er diesen Gesamt-Build durchführen kann.

Evtl. wird es jetzt etwas klarer ... im Grund würde ich gerne das 
"fertige" S19 File mit unserer Lib "patchen" ... wir dürften dann nur in 
vordefinierten Speicher Sections unsere Code / RAM usw. ablegen.

Evtl. funktioniert das auch gar nicht was ich mir da vorstelle!

>Ich bin nicht sicher, ob ich das richtig verstehe, aber ist das nicht
>der normale Vorgang einer Library-Erstellung? Man linkt eine Reihe von
>Modulen zusammen, dabei wird aufgelöst was eben auflösbar ist und der
>Rest bleibt extern. Das Ergebnis wird als Library gespeichert. Den
>Vorgang kann man beliebig wiederholen, möglicherweise ist dazu eine
>Software nötig, die die Bezeichnung "Librarian" oder so trägt.

>Aber auch mit dem Linker müsste es möglich sein, eine Library und einige
>Module zusammenzulinken und das Ergebnis wieder als Library zu
>verwenden.

Aber auch beim "Auflösen" werden ja nur relative Adressen hinterlegt? 
Keine absoluten Speicheradressen? Dies geschieht doch nur beim "finalen" 
Build?

Genau, "unsere" Lib besteht auch aus mehreren Objects, die wir dann im 
finalen Build mit den zulieferer Libs zu einem großen Ganzen 
zusammenfügen.

Gibt es eine Möglichkeit die Lib des Zulieferers so zuschützen, dass ein 
Dissasemblieren von unserer Seite nicht mehr möglich wäre, wir aber 
dennoch in der Lage wären einen Gesamt-"Exe" zu bauen?

Danke Euch.

von turboLoader (Gast)


Lesenswert?

Um nicht lange drum rum zu schwafeln.... ;-)

Der Zulieferer macht die Basis-Software, die Treiber, die Kommunikation, 
spezielle Systemnahe Applikationskomponenten... und wir machen die 
globale Applikationslogik...

2 getrennte Firmen.... spezielle Applikationskomponenten des Zulieferers 
enthalten allerdings Teile in die wir nicht unbedingt hineinschauen 
sollen... z.b. wie bestimmte Regler etc. gelöst sind ...

von Sven P. (Gast)


Lesenswert?

turboLoader schrieb:
> Dies geht aus Know-How Schutz Gründen von unserem Zulieferer nun nicht
> mehr, da er Angst davor hat, dass wir seine Lib reverse-engineeren.
Dann wäre es dringend an der Zeit, entweder den Zulieferer über seine 
schwachsinnige Ansicht aufzuklären oder einen anderen Zulieferer zu 
finden...

Wo genau sieht denn der Zulieferer den Unterschied zwischen einem 
Objekt, welches er euch (wie früher) liefert und einem S-Record-File 
(S19), welches er euch nun liefern möchte? Disassemblieren kann man 
nämlich beides mühelos. Es ist doch übliche Praxis, Bibliotheken 
auszuliefern.

Natürlich kann man beim Linken z.B. ein paar Sektionen für 'euren' Code 
freihalten. Der Zulieferer müsste dann z.B. an Stubs springen. Das sind 
leere Funktionen, die im Assembly z.B. nur aus dem Rücksprung bestehen. 
Solche Stubs kann man wiederum beim Linken auf feste Adresse legen (so 
wie man z.B. manchmal Interrupt-Serviceroutinen an feste Stellen legt), 
sodass das Programm vollständig gelinkt werden kann. Da diese Adresse ja 
bekannt ist, kann man den Rücksprung nachher gegen einen Sprung in 'eure 
echten' Routinen patchen.

Nun mag ich mich wiederholen, wenn ich diese Vorgehensweise für Blödsinn 
halte. Ich finde, irgendwas stimmt in eurer Gesamtkonstruktion inklusive 
Zulieferer nicht so richtig.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Üblich ist in dem Umfeld, zweischrittig zu linken.  Der erste Link ist 
ein "relocatable" Link (-r bei GNU Binutils), die sich nicht über 
nicht-aufgelöste Symbole beschwert.

Der zweite Link ist dann der "final" Link.

von Reinhard Kern (Gast)


Lesenswert?

turboLoader schrieb:
> Gibt es eine Möglichkeit die Lib des Zulieferers so zuschützen, dass ein
> Dissasemblieren von unserer Seite nicht mehr möglich wäre

Nein, das ist grundsätzlich unmöglich - ihr habt von ihm in irgendeiner 
Form ausführbaren Code bekommen, den kann man immer disassemblieren, 
wenn man ihn ausführen kann - wenn nicht ist er nutzlos.

Geschützt ist der Code erst, wenn er in einem internen Flash-Speicher 
untergebracht und nicht mehr extern lesbar ist, und dazu braucht man 
nicht nur den final build, sondern den fertig programmierten Chip.

Ist bloss schade um Zeit und Gehirnschmalz, die ihr dafür investiert.

Gruss Reinhard

von turboLoader (Gast)


Lesenswert?

Danke für eure Posts! ;-)

Zulieferer wechseln geht leider in dieser Domäne nicht... ;-) die haben 
da ziemlich den ganzen Markt aufgekauft und sind momentan fast ausser 
Konkurrenz...

Wir entwickeln modellbasiert, deshalb sind wir bis auf die pragmas im 
Code nicht besonders hardware-nah unterwegs ...

Nach meiner bescheidenen Meinung dachte ich immer, dass "Object-Code" 
leichter zu dissasemblieren ist als die Funktion aus dem s19 File heraus 
zu extrahieren ...

Die Objects / Libraries bündeln zumindest die funktionalen Blöcke schon 
mal in logische Einheiten ...

D.h. kurz zusammengefasst:
- Wenn wir am Ende noch ein s19 File erhalten - welches wir erhalten 
müssen(!), da wir die SW selbst flashen müssen, dann macht es aus 
Know-How Schutz Gründen keinen Unterschied, ob wir Libs / Objects oder 
eben dieses s19 File erhalten?

Danke Euch!

von Rolf Magnus (Gast)


Lesenswert?

Hmm, wenn dein Zulieferer irgendwie einen besonderen Schutz für seinen 
Code will, dann ist es doch eigentlich nicht deine Aufgabe, führ ihn 
einen solchen zu finden und ihm zu sagen, wie der aussehen soll.

von Sven P. (Gast)


Lesenswert?

turboLoader schrieb:
> Wenn wir am Ende noch ein s19 File erhalten - welches wir erhalten
> müssen(!), da wir die SW selbst flashen müssen, dann macht es aus
> Know-How Schutz Gründen keinen Unterschied, ob wir Libs / Objects oder
> eben dieses s19 File erhalten?
Nein, macht quasi(...) keinen Unterschied.


Was passieren könnte: In die Objekt-Dateien/Libs kann man noch Symbole 
einbetten. Dabei kann es sich einerseits um Debug-Symbole handeln, aus 
denen man möglicherweise seine Schlüsse ziehen kann. Die Debug-Symbole 
kann man aber herausstrippen.
Andererseits müssen ja noch die Symbole vorhanden sein, mit denen 
später gelinkt wird. Die kann man sinnigerweise schlecht entfernen, 
bevor gelinkt wurde.

Man kann die aber auf das nötige Minimum reduzieren, indem man zuvor 
alles 'schützenswerte' relozierbar verlinkt und dann im Anschluss nur 
noch ein paar Symbole als Einsprung im Objekt belässt.


Sobald du dein s19-File hast, hast du ausführbaren Code. Den kann man 
immer disassemblieren. Entsprechende Werkzeuge dröseln dir das dann 
möglicherweise auch noch in ein Call-Diagramm auf usw.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.