我用Gtk3库用C语言编写了一个软件,但它有错误和问题。 当我使用 -Wl,-z,noexecstack 标志使用 GCC 进行编译时,如果我单击按钮,软件就会被核心转储。
gcc `pkg-config gtk+-3.0 --cflags` Setup.c -o SSHLD -Wl,-z,noexecstack `pkg-config gtk+-3.0 --libs`
但是当我不使用那里的标志时,它会给出这个错误:
/usr/bin/ld: warning: /tmp/ccNWpHIQ.o: requires executable stack (because the .note.GNU-stack section is executable)
// ...
fixed = gtk_fixed_new ();
gtk_container_add ( GTK_CONTAINER (Frame), fixed );
GtkWidget *scrolled_window = gtk_scrolled_window_new ( NULL, NULL );
gtk_widget_set_size_request ( scrolled_window, 250, 391 );
gtk_scrolled_window_set_policy ( GTK_SCROLLED_WINDOW(scrolled_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC );
gtk_fixed_put ( GTK_FIXED (fixed), scrolled_window, -1, -1 );
gtk_style_context_add_class ( gtk_widget_get_style_context ( scrolled_window ), "Scrolbar" );
GtkWidget *frame = gtk_frame_new ( NULL );
gtk_container_set_border_width ( GTK_CONTAINER (frame), 0 );
gtk_container_add ( GTK_CONTAINER (scrolled_window), frame );
GtkWidget *vbox1 = gtk_box_new ( GTK_ORIENTATION_VERTICAL, 2 );
gtk_container_set_border_width ( GTK_CONTAINER (vbox1), 5 );
gtk_container_add ( GTK_CONTAINER (frame), vbox1 );
/* create Function and Connect to Widget
*/
// GtkWidget *widget, gpointer page
void List_append ()
{
gchar *label_text;
GtkWidget *label;
for ( int i = 1 ; i <= 200 ; i++ )
{
label_text = g_strdup_printf ( "Label %d", i );
label = gtk_label_new ( label_text );
gtk_box_pack_start ( GTK_BOX ( vbox1 ), label, FALSE, FALSE, 5 );
g_free ( label_text );
}
gtk_widget_show_all ( GTK_WIDGET(scrolled_window) );
}
g_signal_connect ( G_OBJECT (refresh) , "clicked",
G_CALLBACK ( List_append ), NULL);
当我删除
g_signal_connect ( G_OBJECT (refresh), "clicked", G_CALLBACK ( List_append ), NULL);
时,一切正常!
/usr/bin/ld: warning: /tmp/ccNWpHIQ.o: requires executable stack (because the .note.GNU-stack section is executable)
有危险吗?
抱歉,如果我英语说得不好
**我想做什么(一目了然)
我在网上搜索并发现以下内容:
错误会降低软件的安全性。/usr/bin/ld: warning: /tmp/ccNWpHIQ.o: requires executable stack (because the .note.GNU-stack section is executable)
您看到的警告通常发生在使用 GTK 库编译 C 代码时。此警告与链接器中的可执行堆栈设置有关。要解决此警告,您可以将
标志添加到编译命令中。该标志告诉链接器不要将堆栈段标记为可执行文件。例如,如果您使用 gcc 编译 C 代码,则可以像这样修改命令:-Wl,-z,noexecstack
确保将gcc -o output_file source_file.c `pkg-config --cflags --libs gtk+-3.0` -Wl,-z,noexecstack
替换为可执行文件所需的名称,将output_file
替换为 C 的实际名称源文件。添加source_file.c
标志应该会抑制警告并编译 GTK 代码而不会出现任何问题。-Wl,-z,noexecstack
但是所有解决方案都不起作用