当我在 Gtk 中使用 -Wl,-z,noexecstack 标志时核心被转储(c)

问题描述 投票:0回答:1

我用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)
有危险吗?

抱歉,如果我英语说得不好

**我想做什么(一目了然)

c gtk gtk3 ld coredump
1个回答
0
投票

我在网上搜索并发现以下内容:

/usr/bin/ld: warning: /tmp/ccNWpHIQ.o: requires executable stack (because the .note.GNU-stack section is executable)
错误会降低软件的安全性。

您看到的警告通常发生在使用 GTK 库编译 C 代码时。此警告与链接器中的可执行堆栈设置有关。要解决此警告,您可以将

-Wl,-z,noexecstack
标志添加到编译命令中。该标志告诉链接器不要将堆栈段标记为可执行文件。例如,如果您使用 gcc 编译 C 代码,则可以像这样修改命令:
gcc -o output_file source_file.c `pkg-config --cflags --libs gtk+-3.0` -Wl,-z,noexecstack
确保将
output_file
替换为可执行文件所需的名称,将
source_file.c
替换为 C 的实际名称源文件。添加
-Wl,-z,noexecstack
标志应该会抑制警告并编译 GTK 代码而不会出现任何问题。

但是所有解决方案都不起作用

© www.soinside.com 2019 - 2024. All rights reserved.