elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Solucionado] Como decirle a GCC que no enlace nada
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Solucionado] Como decirle a GCC que no enlace nada  (Leído 4,347 veces)
4v1dy4

Desconectado Desconectado

Mensajes: 139



Ver Perfil
[Solucionado] Como decirle a GCC que no enlace nada
« en: 18 Enero 2023, 19:41 pm »

Hola,

Yo utilizo WATCOM C para compilar mis programas.

Ya se que esta viejito pero realmente no he encontrado otra herramienta que me de las opciones que me da WATCOM (por ejemplo, que es la que mas aprecio de todas, que me deje incluir ensamblador con sintaxis de Intel, y no de AT&T).

Me veo en la obligacion de actualizarme ya que el compilador de WATCOM soporta hasta 32 bits, que es el wcc386. Ya no 64 bits y ya casi no hay ordenadores con 32 bits.

La cuestion es que estuve intentando hacer lo siguiente con GCC:

Que genere codigo idependiente de la posicion.
Que no incluya ninguna cabecera o archivo "estandar" a menos que lo requiera yo explicitamente en el codigo con alguna directiva #include.
Que me deje programar la rutina __start, que no la incluya por si mismo.

En fin, esto con wcc386 se haria asi:

wcc386 main.c -s -w9 -e25 -oa -d0 -5 -bt=nt

y en GCC segun lo que entiendo, se haria asi:

gcc -pie -nostdlib -nostartfiles main.c -o main.obj

la cuestion es que obtengo esto:

.../std.h:12:14: warning: conflicting types for built-in function 'strlen'
 unsigned int strlen(const char *s);

con la opcion -nostdlib no deberia haber tomado en cuenta la funcion "built-in" strlen ¿O si? ¿O es que se refiere a que la funcion strlen esta hardcoded dentro de GCC?

Por otra parte, si me recomiendan algun otro compilador de C que permita incluir ensamblador de Intel, lo agradeceria mas que esto, ya que no me llevo nada bien con GCC. Me encanta casi todo lo que salio de GNU pero GCC no es una de esas cosas xd


« Última modificación: 18 Enero 2023, 22:13 pm por 4v1dy4 » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como decirle a GCC que no enlace nada
« Respuesta #1 en: 18 Enero 2023, 20:21 pm »

Hay que adivinar, lo usual, asumo que estas incluyendo alguna cabecera y usando el tipo de retorno equivocado (es size_t) para strlen.

https://cplusplus.com/reference/cstring/strlen/

Código
  1. size_t strlen ( const char * str );


En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
4v1dy4

Desconectado Desconectado

Mensajes: 139



Ver Perfil
Re: Como decirle a GCC que no enlace nada
« Respuesta #2 en: 18 Enero 2023, 22:08 pm »

xd

¿Lo usual? ¿O sea, lo dices por lo que dijiste sobre el depurador ahi?

No...

No estoy utilizando depuradores.

este codigo:

Código
  1. unsigned int strlen(void)
  2. {
  3.    return 0;
  4. }
  5.  
  6. int main()
  7. {
  8.    return strlen();
  9. }

si se compila con

wcc386 main.c -s -w9 -e25 -oa -d0 -5 -bt=nt

y luego se procesa el codigo objeto con objconv para que me muestre el codigo en formato de nasm:

objconv -fnasm main.obj -o main.asm

resulta:

Código
  1. global strlen
  2. global main
  3. global _cstart_
  4.  
  5. _cstart_:
  6.  
  7. call main
  8. ret
  9.  
  10. strlen:
  11. mov eax, 0
  12. ret
  13.  
  14. main:
  15. call strlen
  16. ret

el codigo resultante es PIC. No es necesario que sea PIC, pero hay funciones que requiero que sean PIC, porque se implementan en diferentes direcciones. No quiero especificar para no confundir, pero ese seria el objetivo.

Hasta ese punto que mostre no hay problema el problema viene cuando quiero hacer el codigo compatible con sistemas de 64 bits.

El codigo no tiene que ser portable e implemento nuestras propias funciones estandar. No quiero usar las que proporciona GCC.

es decir, entiendo que el prototipo de strlen para el C estandar es:

Código
  1. size_t strlen ( const char * str );

pero no quiero tener nada que ver con el "C estandar", sino lo que ofrece el compilador de WATCOM C, que es que ni compila ni enlaza librerias sin pedirselo.

NOTA en el link que adjuntaste se habla de la API de Windows, en este caso, a pesar de que que hablo de WATCOM, no tiene nada que ver con Windows especificamente. Aunque sin duda el alineamiento es un tema que se debe tomar en cuenta.



Eternal Idol

Ya lo solucione.



Para quien se pregunte como:

Los procedimientos que implementaran estrictamente codigo ensamblador, los implemente en archivos distintos. Los compile con NASM y los enlace con LD junto al codigo en C.

Por otra parte, para decirle a GCC "que no enlace nada" y ademas que no incluya funciones inesperadas:

gcc -pie -nostdlib -nostartfiles -fno-stack-protector main.c -c -O -o main.obj

ADVERTENCIA

Como se puede notar, la necesidad implica saltarse la proteccion del stack (para no incluir funciones "inesperadas").

Esto puede suponer riesgos de SO, obviamente.

Un saludo.
« Última modificación: 18 Enero 2023, 22:22 pm por Eternal Idol » En línea

Eternal Idol
Kernel coder
Moderador
***
Desconectado Desconectado

Mensajes: 5.958


Israel nunca torturó niños, ni lo volverá a hacer.


Ver Perfil WWW
Re: Como decirle a GCC que no enlace nada
« Respuesta #3 en: 18 Enero 2023, 22:22 pm »

¿Lo usual? ¿O sea, lo dices por lo que dijiste sobre el depurador ahi?

No, lo usual es tener que adivinar. No era el tipo de retorno, era el tipo de parametro, en fin.

El codigo no tiene que ser portable e implemento nuestras propias funciones estandar. No quiero usar las que proporciona GCC.

Tenes dos opciones:
- No usar nombres de funciones standard de C
- Implementarlas siguiendo el standard

PD. Me sigue dando el mismo warning con tu ultima linea de comandos; igual es eso, una advertencia y si esta solucionado, perfecto.

main.c:1:15: warning: conflicting types for built-in function 'strlen'; expected 'unsigned int(const char *)' [-Wbuiltin-declaration-mismatch]
    1 |  unsigned int strlen(void)
      |               ^~~~~~
main.c:1:1: note: 'strlen' is declared in header '<string.h>'
  +++ |+#include <string.h>
    1 |  unsigned int strlen(void)
« Última modificación: 18 Enero 2023, 22:28 pm por Eternal Idol » En línea

La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines