Ausführbare Datei aus icon_switch.c

Athur Dent

Athur Dent

Handtuchhalter
Ich habe da ei Problem mit einer Datei Namens icon_switch.c, ich möchte diese Datei zu einer ausführbaren Anwendung machen.
Jedoch bin ich leider des mächtigen C`s nicht mächtig.
Deswegen habe ich gegoogelt und den Befehl:
Code:
gcc -o icon_switch icon_switch.c
gefunden, herraus kam:
Code:
linux-silberfuchs:/usr/include # gcc -o icon_switch icon_switch.c
/tmp/ccgZqirt.o: In function `release_usb_device':
icon_switch.c:(.text+0x22): undefined reference to `usb_release_interface'
icon_switch.c:(.text+0x49): undefined reference to `usb_close'
/tmp/ccgZqirt.o: In function `find_device':
icon_switch.c:(.text+0x9a): undefined reference to `usb_get_busses'
/tmp/ccgZqirt.o: In function `main':
icon_switch.c:(.text+0x1be): undefined reference to `usb_init'
icon_switch.c:(.text+0x1c3): undefined reference to `usb_find_busses'
icon_switch.c:(.text+0x1c8): undefined reference to `usb_find_devices'
icon_switch.c:(.text+0x200): undefined reference to `usb_open'
icon_switch.c:(.text+0x262): undefined reference to `usb_get_driver_np'
icon_switch.c:(.text+0x292): undefined reference to `usb_detach_kernel_driver_np'
icon_switch.c:(.text+0x2dd): undefined reference to `usb_claim_interface'
icon_switch.c:(.text+0x329): undefined reference to `usb_set_altinterface'
icon_switch.c:(.text+0x3b3): undefined reference to `usb_bulk_write'
icon_switch.c:(.text+0x3eb): undefined reference to `usb_release_interface'
icon_switch.c:(.text+0x419): undefined reference to `usb_close'
collect2: ld returned 1 exit status
jetzt hab ich mir die Datei genauer angeschaut und die Abhängigkeiten:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <signal.h>
#include <ctype.h>
#include <usb.h>
gefunden, danach gesucht, brachte unter anderem den Ordner /usr/include/ (waren mehrere Ordner) hervor. Dann habe ich die Datei icon_switch.c in diesen Ordner bzw. auch in /usr/src/linux kopiert und in beiden Ordnern versucht die Datei zu kompilieren -> gleiche Ergebnis.
Mit gcc --help habe ich dann erfahren das ich mit -B einen Pfad angeben kann aber
Code:
gcc -B /usr/include -o icon_switch icon_switch.c
brachte aber immer noch das gleiche Ergebniss.

Hier die ganze icon_switch.c von Josua Dietze
Code:
 /*
  Mode switcher for Option Icon 3G+ USB box

  Copyright (C) 2006  Josua Dietze  (digidietze nospam t-online spamno de)

  Triggers the switching of the box from storage device mode
  to modem (serial) device mode.

  Created with help from usbsnoop2libusb.pl (http://iki.fi/lindi/usb/usbsnoop2libusb.pl)

  Version 0.2, 2006/09/25
    Code cleaning, more messages
  Version 0.1, 2006/09/24
    Just very basic/*
  Mode switcher for Option Icon 3G+ USB box

  Copyright (C) 2006  Josua Dietze  (digidietze nospam t-online spamno de)

  Triggers the switching of the box from storage device mode
  to modem (serial) device mode.

  Created with help from usbsnoop2libusb.pl (http://iki.fi/lindi/usb/usbsnoop2libusb.pl)
 functionality ...


  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details:

  http://www.gnu.org/licenses/gpl.txt

*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <signal.h>
#include <ctype.h>
#include <usb.h>

struct usb_dev_handle *devh;

void release_usb_device(int dummy) {
    int ret;
    printf("Program cancelled by system. Bye\n\n");
    ret = usb_release_interface(devh, 0);
    if (!ret)
	printf(" Oops, failed to release interface: %d\n", ret);
    usb_close(devh);
    if (!ret)
	printf(" Oops, failed to close interface: %d\n", ret);
    printf("\n");
    exit(1);
}

struct usb_device *find_device(int vendor, int product) {
    struct usb_bus *bus;
    struct usb_device *right_dev;
    right_dev = NULL;
    
    printf("Looking for Option Icon USB 3G+ box ...\n");
    for (bus = usb_get_busses(); bus; bus = bus->next) {
	struct usb_device *dev;
	
	for (dev = bus->devices; dev; dev = dev->next) {
	    if (dev->descriptor.idVendor == vendor && dev->descriptor.idProduct == product) {
		right_dev = dev;
	    }
	    if (dev->descriptor.idVendor == 0x0af0 && dev->descriptor.idProduct == 0x6600) {
	        printf("Found box in modem mode. Switching not necessary. Bye\n\n");
		exit(0);		
	    }
	}
    }
    if (right_dev != NULL)
	printf("Found box in storage mode. Preparing for switching ...\n");
    else {
	printf("No Option Icon box found. Is it connected? Bye\n\n");
	exit(0);
    }
    return right_dev;
}

int main(int argc, char **argv) {
    int ret;
    int vendor = 0x05c6;
    int product = 0x1000;

    struct usb_device *dev;
    char buf[65535];

    printf("\n * icon_switch: tool for changing USB mode of Option Icon 3G+ box\n");
    printf(" * (C) Josua Dietze 2006\n");
    printf(" * Works with libusb 0.1.12 and probably other versions\n\n");

    usb_init();
    usb_find_busses();
    usb_find_devices();

    dev = find_device(vendor, product);
    assert(dev);

    devh = usb_open(dev);
    assert(devh);
    
    signal(SIGTERM, release_usb_device);

    printf("Looking for active storage driver ...\n");
    ret = usb_get_driver_np(devh, 0, buf, sizeof(buf));
    if (ret == 0) {
	printf(" OK, driver found (\"%s\"), attempting to detach it ...\n", buf);
	ret = usb_detach_kernel_driver_np(devh, 0);
	if (ret == 0)
    	    printf(" OK, driver \"%s\" successfully detached\n", buf);
	else
    	    printf(" Oops, driver \"%s\" detach failed with error %d. Trying to continue ...\n", buf, ret);
    } else {
        printf("No driver found. Box was not initialized. Can't communicate. Bye\n\n");
	exit(1);
    }
    ret = usb_claim_interface(devh, 0);
    if (ret != 0) {
	printf("Could not claim interface (error %d). Can't communicate. Bye\n\n", ret);
	exit(1);
    }
    
    ret = usb_set_altinterface(devh, 0);
    assert(ret >= 0);
 
 
    memcpy(buf, "\x55\x53\x42\x43\x70\x6e\xde\x86\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 0x000001f);
    ret = usb_bulk_write(devh, 0x00000005, buf, 0x000001f, 1000);
    if (ret >= 0 )
	printf("Device change command successfully sent. Box probably switched.\nLook at /var/log/syslog for result ... Bye\n\n");
    else
	printf("Device change command returned error %d", ret);
 
    ret = usb_release_interface(devh, 0);
    assert(ret == 0);

    ret = usb_close(devh);
    assert(ret == 0);

    return 0;
}

Meine Frage ist jetzt, wie kann ich die Datei kompilieren und wie mache ich das mit den Abhängigkeiten?

Mir ist bekannt, das ich diese Datei auch schon kompiliert saugen kann, es geht aber um Werte ändern (in der Datei) und den gennerellen Ablauf.
 
Also du hast die Datei nicht nur kompiliert sondern auch gelinkt.

Komplieren wäre "gcc -c icon_switch.c". Das liefert dir dann eine icon_switch.o welche du dann mit bestimmten Flags und Libraries linken kannst: "gcc -o icon_switch icon_switch.o -lXYZ".
Hier würde jetzt libXYZ mit hinzugelinkt.

Ich gehe mal schwer davon aus, dass dieser Code eine Library benutzt. Finde raus, welche das ist und versuch es dann mit -lNAME_ohne_lib.
 
Also du hast die Datei nicht nur kompiliert sondern auch gelinkt.

Komplieren wäre "gcc -c icon_switch.c". Das liefert dir dann eine icon_switch.o welche du dann mit bestimmten Flags und Libraries linken kannst: "gcc -o icon_switch icon_switch.o -lXYZ".
Hier würde jetzt libXYZ mit hinzugelinkt.

Ich gehe mal schwer davon aus, dass dieser Code eine Library benutzt. Finde raus, welche das ist und versuch es dann mit -lNAME_ohne_lib.

leider noch nicht ganz, ja Du hast recht es wird die libusb erwähnt, was auch sinn macht, da es ja um USB - Hardware geht aber:
installiert: libusb-0.1.12-27 und
libusb-32bit-o.1.12-27

Code:
linux-silberfuchs:/usr/src/linux # gcc -o icon_switch icon_switch.c -|usb-32bit
bash: usb-32bit: command not found
gcc: -E or -x required when input is from standard input
linux-silberfuchs:/usr/src/linux # gcc -o icon_switch icon_switch.c -|usb-0.1.12-27
bash: usb-0.1.12-27: command not found
gcc: -E or -x required when input is from standard input
linux-silberfuchs:/usr/src/linux # gcc -o icon_switch icon_switch.c -|usb-0.1.12
bash: usb-0.1.12: command not found
gcc: -E or -x required when input is from standard input
linux-silberfuchs:/usr/src/linux # gcc -o icon_switch icon_switch.c -|usb
bash: usb: command not found
gcc: -E or -x required when input is from standard input
linux-silberfuchs:/usr/src/linux #
 
für sowas ist die quick and dirty lösung am besten suche nach der usb.h
und trage dann in die datei statt #include <usb.h>

#include </pfad/zur/datei/usb.h>
 
leider noch nicht ganz, ja Du hast recht es wird die libusb erwähnt, was auch sinn macht, da es ja um USB - Hardware geht aber:
installiert: libusb-0.1.12-27 und
libusb-32bit-o.1.12-27
ich kann leider nur sagen wer lesen kann ist klar im vorteil.
Nchdem ich mir die man gcc nochmal anschaute und mit dem Wissen von hehejo verband änderte sich der Code auf:
Code:
linux-silberfuchs:/usr/src/linux # gcc -o icon_switch icon_switch.c -lusb
linux-silberfuchs:/usr/src/linux #
und lieferte mir das erwünschte Ergebnis.
| und l (L) ist halt doch ein unterschied.

was ich mal wieder vergaß,
Danke
 
für sowas ist die quick and dirty lösung am besten suche nach der usb.h
und trage dann in die datei statt #include <usb.h>

#include </pfad/zur/datei/usb.h>

Auch wenn das Problem schon geloest zu sein scheint nur noch eine kleine Klugscheisserei: Wenn man einen Header in einem speziellen Pfad includen will, muss man die spitzen Klammern durch double quotes ersetzen. Also hier #include "/pfad/zur/datei/usb.h". Nimmt man die spitzen Klammern, wird die Datei im Standard-Include-Verzeichnis gesucht.
 
Hallo,

ich habe eben mal den Thread hier gefunden, da ich vor dem gleichen Problem stehe. Ich versuche eine Vodafone Easybox unter Debian zu installieren. Doch habe ich leider Probleme beim Umwandeln der icon_switch.c. Ich habe die Punkte wie hier beschrieben versucht, doch schmeißt mir der Compiler einige Fehlermeldungen raus beim kompilieren :(

Mit c kann ich leider nur wenig anfangen :/ Könnte mir dabei vielleicht jemand helfen? Komme einfach nicht weiter.

Code:
machine:/usr/local/bin# gcc -o icon_switch icon_switch.c -lusb
icon_switch.c: In function ‘find_device’:
icon_switch.c:60: warning: assignment makes pointer from integer without a cast
icon_switch.c:60: error: dereferencing pointer to incomplete type
icon_switch.c:63: error: dereferencing pointer to incomplete type
icon_switch.c:63: error: dereferencing pointer to incomplete type
icon_switch.c:64: error: dereferencing pointer to incomplete type
icon_switch.c:64: error: dereferencing pointer to incomplete type
icon_switch.c:67: error: dereferencing pointer to incomplete type
icon_switch.c:67: error: dereferencing pointer to incomplete type
icon_switch.c: In function ‘main’:
icon_switch.c:101: warning: assignment makes pointer from integer without a cast

Meine icon_switch.c sieht so aus:
Code:
/*
  Mode switcher for Option Icon 3G+ USB box

  Copyright (C) 2006  Josua Dietze  (digidietze nospam t-online spamno de)

  Triggers the switching of the box from storage device mode
  to modem (serial) device mode.

  Created with help from usbsnoop2libusb.pl ([url]http://iki.fi/lindi/usb/usbsnoop2libusb.pl[/url])

  Version 0.2, 2006/09/25
    Code cleaning, more messages
  Version 0.1, 2006/09/24
    Just very basic functionality ...


  This program is free software; you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation; either version 2 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details:

  [url]http://www.gnu.org/licenses/gpl.txt[/url]

*/

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#include <signal.h>
#include <ctype.h>
#include "/usr/include/linux/usb.h"

struct usb_dev_handle *devh;

void release_usb_device(int dummy) {
    int ret;
    printf("Program cancelled by system. Bye\n\n");
    ret = usb_release_interface(devh, 0);
    if (!ret)
	printf(" Oops, failed to release interface: %d\n", ret);
    usb_close(devh);
    if (!ret)
	printf(" Oops, failed to close interface: %d\n", ret);
    printf("\n");
    exit(1);
}

struct usb_device *find_device(int vendor, int product) {
    struct usb_bus *bus;
    struct usb_device *right_dev;
    right_dev = NULL;
    
    printf("Looking for Option Icon USB 3G+ box ...\n");
    for (bus = usb_get_busses(); bus; bus = bus->next) {
	struct usb_device *dev;
	
	for (dev = bus->devices; dev; dev = dev->next) {
	    if (dev->descriptor.idVendor == vendor && dev->descriptor.idProduct == product) {
		right_dev = dev;
	    }
	    if (dev->descriptor.idVendor == 0x0af0 && dev->descriptor.idProduct == 0x6600) {
	        printf("Found box in modem mode. Switching not necessary. Bye\n\n");
		exit(0);		
	    }
	}
    }
    if (right_dev != NULL)
	printf("Found box in storage mode. Preparing for switching ...\n");
    else {
	printf("No Option Icon box found. Is it connected? Bye\n\n");
	exit(0);
    }
    return right_dev;
}

int main(int argc, char **argv) {
    int ret;
    int vendor = 0x05c6;
    int product = 0x1000;

    struct usb_device *dev;
    char buf[65535];

    printf("\n * icon_switch: tool for changing USB mode of Option Icon 3G+ box\n");
    printf(" * (C) Josua Dietze 2006\n");
    printf(" * Works with libusb 0.1.12 and probably other versions\n\n");

    usb_init();
    usb_find_busses();
    usb_find_devices();

    dev = find_device(vendor, product);
    assert(dev);

    devh = usb_open(dev);
    assert(devh);
    
    signal(SIGTERM, release_usb_device);

    printf("Looking for active storage driver ...\n");
    ret = usb_get_driver_np(devh, 0, buf, sizeof(buf));
    if (ret == 0) {
	printf(" OK, driver found (\"%s\"), attempting to detach it ...\n", buf);
	ret = usb_detach_kernel_driver_np(devh, 0);
	if (ret == 0)
    	    printf(" OK, driver \"%s\" successfully detached\n", buf);
	else
    	    printf(" Oops, driver \"%s\" detach failed with error %d. Trying to continue ...\n", buf, ret);
    } else {
        printf("No driver found. Box was not initialized. Can't communicate. Bye\n\n");
	exit(1);
    }
    ret = usb_claim_interface(devh, 0);
    if (ret != 0) {
	printf("Could not claim interface (error %d). Can't communicate. Bye\n\n", ret);
	exit(1);
    }
    
    ret = usb_set_altinterface(devh, 0);
    assert(ret >= 0);
 
 
    memcpy(buf, "\x55\x53\x42\x43\x70\x6e\xde\x86\x00\x00\x00\x00\x00\x00\x06\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 0x000001f);
    ret = usb_bulk_write(devh, 0x00000005, buf, 0x000001f, 1000);
    if (ret >= 0 )
	printf("Device change command successfully sent. Box probably switched.\nLook at /var/log/syslog for result ... Bye\n\n");
    else
	printf("Device change command returned error %d", ret);
 
    ret = usb_release_interface(devh, 0);
    assert(ret == 0);

    ret = usb_close(devh);
    assert(ret == 0);

    return 0;
}

Muss ich da irgendwas in der source Datei umschreiben? oder habe ich nur wieder irgendwas falsch gemacht? Hoffe mir kann da einer helfen :/

Greetz eldariel
 
Hallo,

ist die libusb installiert?

Code:
dpkg -l |grep libusb
 
Code:
ii  libusb-0.1-4                      0.1.12-5                        userspace USB programming library

sry, hatte ich vergessen zu sagen. Ja libusb ist installiert. Allerdings habe ich wenig Ahnung, wie 2 unterschiedliche Versionen gleichzeitig installiert sein können. Bin noch relativ frisch unter Linux ^^
 
Hi!

Code:
#include "/usr/include/linux/usb.h"
War diese Zeile schon so oder hast du sie geändert? Falls ja, dann ersetzte die Zeile wieder durch die ursprüngliche Zeile: wahrscheinlich
Code:
#include <usb.h>
Es gibt nämlich unter Umständen mehrere unterschiedliche usb.h Dateien auf deinem System und nur mit einer funktioniert dieses Programm.

Außerdem solltest du noch das Paket libusb-dev installieren, weil dieses die entsprechende usb.h (/usr/include/usb.h) enthält.

Versuche nun nochmal das Programm zu kompilieren.
 
Zuletzt bearbeitet:
Vielen Dank! :) libusb-dev hat den Unterschied gemacht. Nun ist die Datei kompiliert und ausführbar :D Dickes Danke.

(hatte die Headerdatei mit Direktpfad eingebunden, weil sie vorher nicht gefunden wurde)
 

Ähnliche Themen

NGINX bietet intern abgerufene Seiten nur zum Download an, extern geht's

Nginx als Reverse Proxy für Nextcloud und Emby

Unix Webserver mit HTML Seite erstellen

Zugriff Ubuntu 16.04. auf Freigabe 18.04. LTS nicht möglich

Prozesskommunikation mit PIPES - wie funktioniert das?

Zurück
Oben