2016-03-04 11 views
6

Le funzioni di libreria hanno l'attributo debole impostato di default (si veda [1]) e potrebbero essere "sovrascritte" con funzioni che hanno la stessa firma per caso. Ad esempio printf chiama internamente fputc e posso facilmente dichiarare una delle mie funzioni int fputc(int, FILE *). Se ciò accade, vorrei ricevere un avviso del compilatore.Come posso impostare un avviso del compilatore (GNU GCC) quando si sovrascrive una funzione debole

C'è un modo per dire al compilatore di avvisarmi in caso di sovrascrittura di una funzione debole?

[1] https://gcc.gnu.org/onlinedocs/gcc-3.2/gcc/Function-Attributes.html

+0

Non sarà un avvertimento del compilatore, ma un avvertimento del linker. BTW GCC3.2 è un encient - non conforme agli attuali standard C11 e C++ 14 - la versione corrente (marzo 2016) è [GCC5] (http://gcc.gnu.org/gcc-5/) così tu dovrebbe * aggiornare * il tuo 'gcc' –

+0

È * permesso * a * ridefinire *' fputc', a condizione che la tua definizione sia conforme allo standard (e che potrebbe essere difficile) –

+0

** Perché lo chiedi? ** e cos'è il vero problema che vuoi risolvere? Sembra un [problema XY] (http://xyproblem.info/) ... Quindi per favore ** modifica la tua domanda ** per spiegare di più e motivarlo –

risposta

3

(sto indovinando sei su Linux, e la compilazione e il collegamento l'applicazione come di consueto, in particolare con il libc.socollegato dinamicamente)

funzioni di libreria hanno l'attributo debole impostato per impostazione predefinita

Questo non è sempre vero; sul mio sistema fputc non è un simbolo debole:

% nm -D /lib/x86_64-linux-gnu/libc-2.21.so|grep fputc 
000000000006fdf0 T fputc 
0000000000071ea0 T fputc_unlocked 

(se era debole, il T sarebbe un W, e in effetti write è debole)

BTW, ridefinendo il proprio fputc (o malloc) è legittimo (e potrebbe essere utile, ma è molto complicato), purché mantenga una conformità semantica allo standard. I simboli più generalmente deboli dovrebbero essere ridefinibili (ma questo è difficile).

C'è un modo per dire al compilatore di avvisarmi in caso di sovrascrittura di una funzione debole?

No (il compilatore non si può mettere in guardia affidabile).

Dal l' unica cosa che potrebbe dare qualche avvertimento è non il compilatore (che non sa quale particolare libc sarebbe stata usata in fase di esecuzione, si potrebbe aggiornare il tuo libc.so dopo la compilazione), ma il linker, e altro ancora precisamente il dynamic linker, ovvero ld-linux(8). E gli avvertimenti potrebbero essere forniti in modo affidabile solo in fase di esecuzione (perché il libc.so potrebbe essere diverso al momento della compilazione e in fase di esecuzione). Forse vuoi LD_DYNAMIC_WEAK.

Se si è pronti a spendere settimane di lavoro su una soluzione, si potrebbe considerare l'utilizzo GCC MELT con il proprio MELT estensione e personalizzare un recenteGCC per emettere un avviso quando un simbolo debole da un libc disponibili al momento della compilazione (che potrebbe non essere lo stesso libc collegato dinamicamente in fase di runtime, quindi tale controllo ha un'utilità limitata) viene ridefinito.

Forse potresti usare un po 'di LD_PRELOAD trick.

Inoltre, se si è collegata staticamente l'applicazione, il linker potrebbe fornire la diagnostica se si ridefinisce una funzione libc.

Leggi anche Drepper's How to Write a Shared Library & libro di Levine Linkers & loaders.

Problemi correlati