Gast
#5697943
Moin, kann mir jemand von euch "C" Spezies erklären, was diese Zeile bewirkt?
1 | |
|
Anzeige
|
[C] Was bewirkt diese Zeile?
Gast
#5697943
Moin, kann mir jemand von euch "C" Spezies erklären, was diese Zeile bewirkt?
Gast
#5697946
Vermutlich sollen vorher APP_NAME, APP_VERSION und APP_COMPANY als
Makros für Stringliterale definiert werden. Diese werden mit 0-Bytes als
Trennzeichen zusammengehängt und in ein char-Array ("String")
geschrieben. Dieses Array wird in die Linker Input Section ".Copyright"
geschrieben, welche dann vom Linkerscript an eine bestimmte Position im
Speicher gelegt werden kann.
Gast
#5697949
Dr. Sommer schrieb: > Dieses Array wird in die Linker Input Section ".Copyright" Und was bewirkt das? Einfachere Handhabung? Aufruf?
Gast
#5697951
Harry L. schrieb: > Und was bewirkt das? Einfachere Handhabung? Aufruf? Kann man nicht pauschal beantworten. Möglicherweise soll so ermöglicht werden, dass man die entsprechende Stelle im Programmspeicher (Flash?) des Systems auslesen kann um die Programmversion zu ermitteln. Quasi als Embedded Äquivalent des Eigenschaften-Dialogs von .exe-Dateien im Windows Explorer. Ohne die extra Section würde der Linker das Array "irgendwo" in den Speicher packen und man würde es nicht so leicht finden.
Gast
#5698057
Dr. Sommer schrieb: > Harry L. schrieb: >> Und was bewirkt das? Einfachere Handhabung? Aufruf? > > Kann man nicht pauschal beantworten. Möglicherweise soll so ermöglicht > werden, dass man die entsprechende Stelle im Programmspeicher (Flash?) > des Systems auslesen kann um die Programmversion zu ermitteln. Quasi als > Embedded Äquivalent des Eigenschaften-Dialogs von .exe-Dateien im > Windows Explorer. Ohne die extra Section würde der Linker das Array > "irgendwo" in den Speicher packen und man würde es nicht so leicht > finden. Verstehe den Sinn nicht so ganz. Dafür hat man doch extra sein Array (AppName[])
Gast
#5698062
Wenn das in einer extra section liegt, kann der Optimizer erkennen ob es verwendet wird oder nicht und dementsprechend rauskicken oder nicht.
Gast
#5698088
Harry L. schrieb: > Verstehe den Sinn nicht so ganz. Dafür hat man doch extra sein Array > (AppName[]) Wenn du nur den Controller vor der Nase hast oder auch nur eine binäre Flash-Image-Datei ("ROM") ohne Header, aber keine ELF-Datei (selbst der Source Code hilft hier nur bedingt) hast du keine Ahnung, wo im Flash der Linker das Array abgelegt hat. Daher kannst du von außerhalb des Programms (z.B. per Hex-Editor) das Array nur schwer finden und lesen. PPB schrieb: > Wenn das in einer extra section liegt, kann der Optimizer erkennen > ob es > verwendet wird oder nicht und dementsprechend rauskicken oder nicht. Dazu würde man aber eher nicht das "section"-Attribut nutzen sondern die -fdata-sections Option.
Gast
#5698108
Harry L. schrieb: > Verstehe den Sinn nicht so ganz. Dafür hat man doch extra sein Array > (AppName[]) Und jetrzt hast Du noch irgendein Configprogramm z.B. unter Windows, mit dem man die Firmware einspielen kann. Woran erkennt man jetzt die Firmware-Version? Kann man über den Dateinamen des Bin/Hexfiles machen und hoffen, daß der Dateiname auch wirklich immer den Inhalt richtig wiedergibt. Man kann das Config-Programm aber auch direkt im Bin/Hexfile nachgucken lassen, dann ist der Dateiname egal. Dazu muß das Configprogramm aber auch wissen, an welcher Stelle der Datei es denn gucken soll.
Gast
#5698140
PPB schrieb: > Wenn das in einer extra section liegt, kann der Optimizer erkennen ob es > verwendet wird oder nicht und dementsprechend rauskicken oder nicht. Ich glaube nicht, dass das sinn der Sache war. Vermutlich wollten die schon __attribute__((section(".Copyright"),used)). Ich hab mir auch schon überlegt, ob ich nicht ein
Und dann in den C Dateien:
Dann könnte ich automatisiert die online Binaries nach danach durchsuchen:
Und den OSS Dieben sagen: Hey, du hast meinen Code genutzt, du musst das Programm unter der GPL veröffentlichen.
Gast
#5698145
DPA schrieb: > Dann könnte ich automatisiert die online Binaries nach danach > durchsuchen: Hinterhältig! Baue aber noch eine "verschlüsselte"/obfuskierte Version des Texts ein, damit den nicht einer zufällig findet und überschreibt. Am Besten noch mit Prüfsumme über das ganze Binary, welche beim Start geprüft wird... :-)
Gast
#5698171
Dr. Sommer schrieb: > Baue aber noch eine "verschlüsselte"/obfuskierte Version > des Texts ein, damit den nicht einer zufällig findet und überschreibt. Eine UUID in einem Headerfile einbauen, oder eine Signatur mit einem Abstandpattern oder so, währe wohl noch OK. > Am Besten noch mit Prüfsumme über das ganze Binary, welche beim Start > geprüft wird... Davon halte ich nichts. Ich bin ein strickter Gegner von DRM. Sowas führt nur zu Problemen, und schränkt auf technische weise die Rechte von Leuten ein, die sie Gesetzeswegen eigentlich gehabt hätten. Abgesehen davon, das sowas für das, was es gedacht war, nie funktioniert. Ich hab sogar noch irgendwo einen vorbereiteten Initiativtext herumliegen, um alle derartigen aktiv einschränkenden technischen Massnahmen in der Schweiz zu verbieten, hatte aber noch keine Zeit, das organisatorische durchzuplanen und die Initiative effektiv zu starten. Die Freiheiten aller natürlichen Personen zu Maximieren ist ein Grundsatz hinter vieler meiner Entscheidungen.
Gast
#5698174
Dr. Sommer schrieb: > Am Besten noch mit Prüfsumme über das ganze Binary, welche beim Start > geprüft wird... :-) Das macht man doch sowieso, schon damit man erkennen kann, ob der FW-Upload wirklich richtig funktioniert hat. Oder ob nach vielen Jahren der FW-Inhalt überhaupt noch richtig ist.
Gast
#5698177
DPA schrieb: > Davon halte ich nichts. Ich bin ein strickter Gegner von DRM. Da bin ich ganz bei dir. DRM z.B. bei Blu-Rays nützt im Endeffekt vermutlich niemandem. Allerdings ist das hier ja kein richtiges DRM - wenn die Software sowieso Open Source ist, kann man Modifikationen vornehmen. Es soll ja nur verhindert werden, dass sie jemand entgegen der Open-Source-Lizenz nutzt indem er z.B. nicht auf die Verwendung hinweist und eben den Urheberrechts-Hinweis entfernt. Nop schrieb: > Das macht man doch sowieso Im Idealfall... ;-) Leider kann z.B. der GNU ld keine Checksums berechnen. Das macht die Sache etwas lästiger.
Gast
#5698182
Dr. Sommer schrieb: > Im Idealfall... ;-) Leider kann z.B. der GNU ld keine Checksums > berechnen. Das macht die Sache etwas lästiger. Dafür hat man nach Jahren der Entwicklung eh ein Tool im Fundus, was das mit dem fertigen Hexfile macht.
Gast
#5698187
Nop schrieb: > Dafür hat man nach Jahren der Entwicklung eh ein Tool im Fundus, was das > mit dem fertigen Hexfile macht. Ist eine Möglichkeit, finde ich aber etwas unsauber. Ist natürlich besser als nichts.
Gast
#5698206
Dr. Sommer schrieb: > Allerdings ist das hier ja kein richtiges DRM - > wenn die Software sowieso Open Source ist, kann man Modifikationen > vornehmen. Es soll ja nur Das spielt für mich ehrlich gesagt keine rolle. Ob es jetzt OpenSource ist oder nicht, ob es einfach zu entfernen ist oder nicht, ob es ein anderes Verfahren ist oder nicht, ist aus meiner Sicht völlig irrelevant. Solange es existiert, bereitet es Probleme. Das Argument ist aber nicht unbeliebt, als die W3C EME eingeführt hat, argumentierten sie noch es sei kein DRM, sondern nur eine Schnittstelle für DRM. Oder bei vielen Games mit always online DRM wird einfach behauptet, die konstante Verbindung sei für die Funktion und Art des Games notwendig, und deshalb kein DRM. Gibt sicher noch weitere Beispiele.
Gast
#5698212
Dr. Sommer schrieb: > Ist eine Möglichkeit, finde ich aber etwas unsauber. Ist natürlich > besser als nichts. Ich find's deswegen sauber, weil das mit jedem Hexfile funktioniert, und weil man dann auch leicht sicherstellen kann, daß die CRC-Berechnung wirklich übereinstimmt. CRC-Polynom, gedreht/nicht gedreht, mit/ohne Invertierung, Auffüllung mit FF oder 00, CRC in welcher Endianess, und was ist, wenn Host/Target unterschiedliche Endianess haben. Da gibt's soviele Freiheitsgrade, daß man sich damit lange beschäftigen kann. Man kann so ein Tool dann sogar ins Makefile als notwendiges Target setzen, und wenn es nicht da ist, wird es eben erzeugt. Daß man dessen Source zusammen mit dem Projekt ablegen muß, ist ja klar. Die Alternative mit dem Linker wäre auch nicht sauberer, weil man dann nämlich im Sourcetext Annahmen über das Linkerverhalten machen muß, was oftmals eine eher wackelige Sache ist und obendrein auch noch an einen spezifischen Compiler gebunden.
Gast
#5698216
Es schränkt aber eben nur die Möglichkeit des Open-Source-Lizenz-Verletzers ein, die Software entgegen der Lizenz zu benutzen und somit die Möglichkeiten der Gesamtheit zu beschränken - in Summe haben also mehr Leute was davon... Aber okay, da mittels Sourcecode der Hinweis ohnehin trivial entfernt werden kann, ist es sowieso irrelevant.
Gast
#5698230
Nop schrieb: > Die Alternative mit dem Linker wäre auch nicht sauberer, weil man dann > nämlich im Sourcetext Annahmen über das Linkerverhalten machen muß Muss man beim externen Tool aber auch. Das muss die Prüfsumme an eine ganz bestimmte Stelle im Binary unterbringen - typischerweise irgendwo zwischen Interrupt-Vektor und eigentlichem Code. Könnte man die Prüfsumme übers Linkerscript konfigurieren, kann man da zentral ihre Adresse angeben. Der Sourcecode muss sowieso Annahmen über das Linkerscript machen, um globale Variablen zu initialisieren o.ä. Er könnte die Adresse der Prüfsumme als Symbol benutzen. Das nächste Problem ist: Will man eine ELF-Datei per JTAG-Debugger ausführen, muss die Prüfsumme da auch irgendwo rein. Wäre praktisch, wenn der Linker das direkt erledigen würde! Manuell in ELF-Dateien rumfummeln ist auch nicht so optimal.
Gast
#5698271
Dr. Sommer schrieb: > Muss man beim externen Tool aber auch. Stimmt, aber wenn man dessen Source hat, ist das ja kein Problem. > Das muss die Prüfsumme an eine > ganz bestimmte Stelle im Binary unterbringen - typischerweise irgendwo > zwischen Interrupt-Vektor und eigentlichem Code. Oder am Ende, wobei dann die aufgefüllte Binary-Länge bekannt sein muß, normalerweise als Konstante im Makefile. Das kriegt das Tool dann als CLI-Parameter und der Sourcecode per Define im Compiler-Aufruf. > Das nächste Problem ist: Will man eine ELF-Datei per JTAG-Debugger > ausführen, muss die Prüfsumme da auch irgendwo rein. Stimmt, das ist nicht so schick. Solange die Prüfsumme nur zur Diagnostik genutzt wird, ist es egal, dann kommt eben eine Meldung. Ansonsten kenne ich das so, daß es irgendwo ein Debug-Define gibt, mit dem dann auch die Checksumme überbrückt wird. Braucht man ja eh, um z.B. den Watchdog abzuschalten. Aber wenn man CRC-32 nimmt, sagt man damit ja schon aus, daß das eh nicht für DRM gedacht ist. Um nachzuweisen, daß der Code von einem selber ist, etwa für GPL-Abmahnungen bei Lizenzverletzung, würde man eher unschuldig aussehende Sachen irgendwo zusammenbauen. Eventuell Autorenname und GPL-Hinweis mit ROT-13 noch versehen.
Gast
#5698279
Nop schrieb: > normalerweise als Konstante im Makefile. Die ändert sich doch ständig, wenn man den Code ändert. Und länger als nötig muss man ein Image auch nicht machen... Nop schrieb: > Ansonsten kenne ich das so, daß es irgendwo ein Debug-Define gibt, mit > dem dann auch die Checksumme überbrückt wird. Ginge auch. Leider bleiben oft Debug-Images dann doch oft länger als gedacht auf dem Controller - man müsste zusätzlich abfragen, ob ein Debugger angeschlossen ist, und wenn nicht die Arbeit verweigern (geht beim Cortex-M zum Glück). Nop schrieb: > Aber wenn man CRC-32 nimmt, sagt man damit ja schon aus, daß das eh > nicht für DRM gedacht ist. Stimmt, guter Punkt.
Gast
#5698342
Dr. Sommer schrieb: > Es schränkt aber eben nur die Möglichkeit des > Open-Source-Lizenz-Verletzers ein Die Anforderung ist schlicht nicht erfüllbar, so funktioniert die Realität nicht. Code, der die Nutzbarkeit eines Programs oder sonst was einschränken soll, deckt zwangsläufig nicht alle fälle ab, das ist schlicht nicht möglich. Beim ersten unvorhergesehenen Umstand, Fehler, umgekipptem Bit, etc. sagt sowas Stop, und auch wenn man das jetzt umgehen kann, das ist für den Nutzer erstmal ein Problem. Ausserdem ist es auch nicht möglich, Gesetze eindeutig und alle fälle abdeckend zu Kodieren. Was erlaubt ist und was nicht, ist je nach Jurisdiktion unterschiedlich. Nicht alles was in den Lizenzen steht, gilt auch in allen fällen. Zudem ist die Entscheidung, was gesetzlich erlaubt ist und was nicht, letztendlich Sache der Gerichte, und nicht des Entwicklers des DRM oder der Anwendung. Das Durchsetzen von Gesetzen ist auch Sache des Rechtssystems, und nicht die unsere. Aus meiner sicht stellt es sich so dar, dass man mit DRM letztendlich das Gesetz in die eigene Hand nimmt, eigene Gesetze (aka. Regeln) macht, und das Rechtsystem umgeht. Ich kann dir ein Messer verkaufen unter der Auflage, du darfst damit keine Äpfel schneiden. Rechtlich gesehen ist es dann aber dann normalerweise trotzdem dein Messer, und du darfst trotzdem Äpfel damit schneiden. Du siehst das Problem? Eigeninteresse macht dich nicht zum Richter.
Gast
#5698359
Dr. Sommer schrieb: > die Software entgegen der Lizenz zu benutzen und somit die Möglichkeiten der Gesamtheit zu beschränken - Das letztere folgt aber nicht aus ersterem, ganz im gegenteil. > in Summe haben also mehr Leute was davon Ich sehe nicht, wer davon was haben soll. Eine technische Einschränkung ist eine Einschränkung ist eine Einschränkung. Wenn ich als natürliche Person etwas nicht tun kann, ist das immer ein Minderwert, und kein Mehrwert.
Gast
#5698393
DPA schrieb: > Wenn ich als natürliche > Person etwas nicht tun kann, ist das immer ein Minderwert, und kein > Mehrwert. Wenn der Entwickler vor Dir nicht die Möglichkeit hatte, sich Opensource-Code zu nehmen, den etwas umzubauen und ihn dann closed zu machen, sondern ihn ebenfalls als open freigeben MUSSTE, dann bringt das Dir mehr Möglichkeiten. Deswegen gibt's die GPL ja.
Gast
#5698432
Nop schrieb: > DPA schrieb: >> Wenn ich als natürliche >> Person etwas nicht tun kann, ist das immer ein Minderwert, und kein >> Mehrwert. > > Wenn der Entwickler vor Dir nicht die Möglichkeit hatte, sich > Opensource-Code zu nehmen, den etwas umzubauen und ihn dann closed zu > machen, sondern ihn ebenfalls als open freigeben MUSSTE, dann bringt das > Dir mehr Möglichkeiten. Deswegen gibt's die GPL ja. Hier macht das tun Können und das Dürfen einen grossen unterschied. Ich kann GPL Code in nicht legaler weise verwenden, ich bin frei das zu tun. Ich darf es nur nicht, im Idealfall wird der Rechtsweg gegangen, und dann muss man eben die Konsequenzen tragen. Andererseits kann ich den GPL Code auch rein Privat nutzen, ohne je irgendwas zu veröffentlichen, und es gibt nichts, dass das verbieten oder verhindern würde. Das ist das Schöne am Rechtssystem. Es verhindert nicht, das man etwas tun kann oder könnte, dafür ist es nicht da. Unrechtmässiges hat immer noch Konsequenzen, aber ich bin frei, unrecht zu tun. Meine Freiheit ist nicht über das hinaus eingeschränkt, was erlaubt oder notwendig wäre, aber meine Rechte sind dennoch, soweit vertretbar, sichergestellt. Das ist der Grund, warum es hier keinen Minderwert gibt, es gibt keine Einschränkung, was ich tun kann. Dennoch sind die Ansprüche aller sichergestellt. Jeder bekommt, was er sich ausgesucht hat. Der Vorteil einer CRC und Programmgröße in einer Section am Anfang des Binary ist eine kürzere Programmierzeit durch den Bootloader, wenn das Flash nur teilweise belegt ist. Wir verwenden solche Sections auch, um die Version des Bootloaders und der Anwendungsfirmware an festen Adressbereichen zu speichern. Damit kann z.B. die Firmware auslesen, welcher Bootloader Version im System vorhanden ist. Viele Grüße, Stefan
Gast
#5699410
Warum werden die einzelnen "Strings" mit "\0" miteinander verkettet?
wird ja nur "eins" ausgeben. Warum nicht STR1 " " STR2 " " STR3 "\0"? zitter_ned_aso schrieb: > Warum werden die einzelnen "Strings" mit "\0" miteinander verkettet? Damit man sie sauber voneinander trennen kann? >
> > wird ja nur "eins" ausgeben. Ja. Und? Die Strings stehen da nicht zu dem Zweck, mit puts() oder anderweitig ausgegeben zu werden. > Warum nicht STR1 " " STR2 " " STR3 Weil ein Leerzeichen kein eindeutiger Trenner ist? Das ist eine Signatur. Die hat den Zweck, daß man das Flash-Image automatisch zuordnen kann. Welche App da drin ist, welche Version, von welchem Anbieter. Für einen Menschen könnte man das einfach als String-Konstante in das Programm packen; die würde dann irgendwo im Image stehen und ein Mensch könnte sie durch scharfes Hinsehen, evtl. mit der Hilfe des "strings" Kommandos finden. Aber wenn das ein Programm erledigen soll, vielleicht gar ein minimalistisches Programm wie ein Bootloader, dann sollte die Signatur besser an einer genau definierten Stelle im Image stehen. Deswegen die extra Memory-Sektion. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|