Programa en C

Iniciado por XKC, 2 Enero 2016, 20:06 PM

0 Miembros y 1 Visitante están viendo este tema.

XKC

Hola buenas y gracias a todos por vuestro tiempo. Bien tengo una duda y es que programo en C desde ubuntu compilando con gcc, si quisiera hacer un programa que funcionara en windows que tendría que hacer?.Es que he oído por ahí que al crear un ejecutable debe funcionar en todos los equipos, pero a mi no me pasa. Como hacer un programa que funciones en diferentes equipos? Gracias.

Enviado desde mi Orange Hi 4G mediante Tapatalk
Para poder atacar y vencer con seguridad, ataca donde ellos no puedan defenderse.
Para defenderte y resistir firme, defiéndete en donde ellos no atacarán.

mester

Cita de: delta@tango.beta en  2 Enero 2016, 20:06 PM
Hola buenas y gracias a todos por vuestro tiempo. Bien tengo una duda y es que programo en C desde ubuntu compilando con gcc, si quisiera hacer un programa que funcionara en windows que tendría que hacer?.Es que he oído por ahí que al crear un ejecutable debe funcionar en todos los equipos, pero a mi no me pasa. Como hacer un programa que funciones en diferentes equipos? Gracias.

Enviado desde mi Orange Hi 4G mediante Tapatalk

http://stackoverflow.com/questions/1714245/difference-between-if-definedwin32-and-ifdefwin32
http://stackoverflow.com/questions/662084/whats-the-difference-between-the-win32-and-win32-defines-in-c
Un ejemplo de uso:

#if defined (__unix__)
  #include <sys/time.h>
  #include <sys/stat.h>
  #include <sys/types.h>
  #include <unistd.h>
#elif defined (_WIN32)
  #include <winsock2.h>
  #include <conio.h>
  #include <windows.h>
  #include <winuser.h>
  #include <winbase.h>
#endif


No puedes hacer un ejecutable único a no ser que hablemos de java o lenguajes interpretados como Python, Perl, etc...
En el caso de C debes especificarle al compilador las opciones que tienes. En este ejemplo si compilas en Linux, GCC te compilará las librerías:
  #include <sys/time.h>
  #include <sys/stat.h>
  #include <sys/types.h>
  #include <unistd.h>
En el caso de que compiles en Windows, GCC compilará:
  #include <winsock2.h>
  #include <conio.h>
  #include <windows.h>
  #include <winuser.h>
  #include <winbase.h>
E ignorará las de Unix.

Como te he dicho, no puedes hacer un ejecutable único, pero sí que puedes hacer un programa que se pueda compilar en los dos sistemas sin fallos. Un buen ejemplo es el código de Netcat.
Justicia es dar a cada uno lo que se merece

XKC

Ostras muchisimas gracias, ahora lo entiendo..jejjej.
Es que lo del ejecutable lo lei en un tema de python y me lio. Los lenguajes interpretados son ejecutables en cualquier SO?

Enviado desde mi Orange Hi 4G mediante Tapatalk
Para poder atacar y vencer con seguridad, ataca donde ellos no puedan defenderse.
Para defenderte y resistir firme, defiéndete en donde ellos no atacarán.

MAFUS

Los lenguajes interpretados pasan por un interprete que es un programa compilado bajo cierta arquitectura y S.O., por eso, siempre que exista un interprete ese código funcionará.
En cambio en un programa compilado el código es específico de una arquitectura y S.O. Si llevas el programa a otro procesador que no sea compatible va a fallar por diferencias en el código máquina, aunque los dos corran el mismo S.O. Si compilas en para un mismo procesador, pero los S.O. son diferentes tampoco va a funcionar por las diferencias intrínsecas de los propios SS.OO. (llamadas al sistema, la forma en que se preparan las llamadas a las funciones y como se llaman,  estructuras internas, etc.)

XKC

Cita de: MAFUS en  2 Enero 2016, 21:24 PM
Los lenguajes interpretados pasan por un interprete que es un programa compilado bajo cierta arquitectura y S.O., por eso, siempre que exista un interprete ese código funcionará.
En cambio en un programa compilado el código es específico de una arquitectura y S.O. Si llevas el programa a otro procesador que no sea compatible va a fallar por diferencias en el código máquina, aunque los dos corran el mismo S.O. Si compilas en para un mismo procesador, pero los S.O. son diferentes tampoco va a funcionar por las diferencias intrínsecas de los propios SS.OO. (llamadas al sistema, la forma en que se preparan las llamadas a las funciones y como se llaman,  estructuras internas, etc.)
vale, muchas gracias ahora lo entiendo. Pero una ultima duda que tengo, entonces el malware que se desarrolla y se envia de manera masiva como consiguen que funcione en diferentes maquinas (en caso de que este creado en lenguajes compilados).Muchas gracias por su tiempo.Un saludo.
Para poder atacar y vencer con seguridad, ataca donde ellos no puedan defenderse.
Para defenderte y resistir firme, defiéndete en donde ellos no atacarán.

class_OpenGL

No soy un entendido en malware, pero creo que la principal forma de enviar virus de forma masiva es crearlos para Windows. Este sistema operativo es el más común en los ordenadores personales. Ahora bien, no sé si habrá más técnicas para distribuir también a otros sistemas operativos

Programador aficionado. Me quiero centrar en programar videojuegos. La API que uso para crearlos es OpenGL

MAFUS

#6
Hay más cosas.

No todo es el sistema operativo y el tipo de máquina en sí.
También están las llamadas máquinas virtuales, como son la de Java, el JIT de .NET, etc. También están los entornos de ejecución como los navegadores con sus plugins (el navegador está compilado para cada plataforma a la que da soporte, pero los plugins son genéricos, eso es todos los navegadores de esa marca aceptarán ese plugin ); o un caso muy famoso el Flash y sus animaciones/banners/contenido activo.

Si hay un bug en estas máquinas virtuales (entiéndase todo lo anterior mencionado) que hace cosas que no debería hacer en el sistema anfitrión, ese bug, por lo general, estará en todas las plataformas a las que se puede instalar esa máquina virtual y un malware escrito para esa máquina virtual que explote ese bug puede comprometer y compromete la seguidad y el buen funcionamiento del sistema anfitrión.




Por cierto, sí se puede compilar desde una plataforma para otra. La técnica se llama cross-compiling. Para ello se utilizan los cross compilers que son capaces de compilar para otras arquitecturas. Hay muchos tipos: Linux a Windows y viceversa, Linux a Arduino, Windows a Arduino, L/W a uPIC, a Android, a iOS, etc. etc. etc.

Tal vez era esto lo que querías. Busca información de cross-compiling de Linux para Windows.

XKC

Cita de: MAFUS en  4 Enero 2016, 16:46 PM
Por cierto, sí se puede compilar desde una plataforma para otra. La técnica se llama cross-compiling. Para ello se utilizan los cross compilers que son capaces de compilar para otras arquitecturas. Hay muchos tipos: Linux a Windows y viceversa, Linux a Arduino, Windows a Arduino, L/W a uPIC, a Android, a iOS, etc. etc. etc.

Tal vez era esto lo que querías. Busca información de cross-compiling de Linux para Windows.
Muchas gracias, si algo así era lo que estaba buscando. Me habéis ayudado mucho, con gente como vosotros da gusto.Gracias.

Enviado desde mi Orange Hi 4G mediante Tapatalk
Para poder atacar y vencer con seguridad, ataca donde ellos no puedan defenderse.
Para defenderte y resistir firme, defiéndete en donde ellos no atacarán.