我在构建中添加lib链接时的Segfault

时间:2013-10-10 07:57:45

标签: c linux gcc linker

我有一个我成功构建的porgram,但是当我运行该程序时,我得到了一个段错误。

在这个程序的构建中,我建立了许多库的链接:

-llib1 -llib2 -llib3

segfault与源代码无关,但它与库加载lib2有关。

我尝试了一个hello world program

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("hello world! \n");
}

我使用-llib1 -llib2 -llib3

构建时遇到段错误

但是当我使用-llib1 -llib3

构建时,我不会遇到段错误

一般情况下(没有详细信息)可能导致此段错误的原因是什么?

修改

lib2在其一个头文件中包含以下行

#    ifdef __GNUC__
__attribute__ ((__format__ (__printf__, 3, 4)))
#    endif /* __GNUC__ */

以上代码是否会导致段错?

来自开源libminixml

minixml.h

extern int      mxmlSetTextf(mxml_node_t *node, int whitespace,
                         const char *format, ...)
#    ifdef __GNUC__
__attribute__ ((__format__ (__printf__, 3, 4)))
#    endif /* __GNUC__ */
;
extern int      mxmlSetUserData(mxml_node_t *node, void *data);

整个 minixml.h 文件:

#ifndef _mxml_h_
#  define _mxml_h_

/*
 * Include necessary headers...
 */

#  include <stdio.h>
#  include <stdlib.h>
#  include <string.h>
#  include <ctype.h>
#  include <errno.h>


/*
 * Constants...
 */

#  define MXML_TAB      8   /* Tabs every N columns */

#  define MXML_NO_CALLBACK  0   /* Don't use a type callback */
#  define MXML_INTEGER_CALLBACK mxml_integer_cb
                    /* Treat all data as integers */
#  define MXML_OPAQUE_CALLBACK  mxml_opaque_cb
                    /* Treat all data as opaque */
#  define MXML_REAL_CALLBACK    mxml_real_cb
                    /* Treat all data as real numbers */
#  define MXML_TEXT_CALLBACK    0   /* Treat all data as text */
#  define MXML_IGNORE_CALLBACK  mxml_ignore_cb
                    /* Ignore all non-element content */

#  define MXML_NO_PARENT    0   /* No parent for the node */

#  define MXML_DESCEND      1   /* Descend when finding/walking */
#  define MXML_NO_DESCEND   0   /* Don't descend when finding/walking */
#  define MXML_DESCEND_FIRST    -1  /* Descend for first find */

#  define MXML_WS_BEFORE_OPEN   0   /* Callback for before open tag */
#  define MXML_WS_AFTER_OPEN    1   /* Callback for after open tag */
#  define MXML_WS_BEFORE_CLOSE  2   /* Callback for before close tag */
#  define MXML_WS_AFTER_CLOSE   3   /* Callback for after close tag */

#  define MXML_ADD_BEFORE   0   /* Add node before specified node */
#  define MXML_ADD_AFTER    1   /* Add node after specified node */
#  define MXML_ADD_TO_PARENT    NULL    /* Add node relative to parent */


/*
 * Data types...
 */

typedef enum mxml_sax_event_e       /**** SAX event type. ****/
{
  MXML_SAX_CDATA,           /* CDATA node */
  MXML_SAX_COMMENT,         /* Comment node */
  MXML_SAX_DATA,            /* Data node */
  MXML_SAX_DIRECTIVE,           /* Processing directive node */
  MXML_SAX_ELEMENT_CLOSE,       /* Element closed */
  MXML_SAX_ELEMENT_OPEN         /* Element opened */
} mxml_sax_event_t;

typedef enum mxml_type_e        /**** The XML node type. ****/
{
  MXML_IGNORE = -1,         /* Ignore/throw away node @since Mini-XML 2.3@ */
  MXML_ELEMENT,             /* XML element with attributes */
  MXML_INTEGER,             /* Integer value */
  MXML_OPAQUE,              /* Opaque string */
  MXML_REAL,                /* Real value */
  MXML_TEXT,                /* Text fragment */
  MXML_CUSTOM               /* Custom data @since Mini-XML 2.1@ */
} mxml_type_t;

typedef void (*mxml_custom_destroy_cb_t)(void *);
                    /**** Custom data destructor ****/

typedef void (*mxml_error_cb_t)(const char *);  
                    /**** Error callback function ****/

typedef struct mxml_attr_s      /**** An XML element attribute value. @private@ ****/
{
  char          *name;      /* Attribute name */
  char          *value;     /* Attribute value */
} mxml_attr_t;

typedef struct mxml_element_s       /**** An XML element value. @private@ ****/
{
  char          *name;      /* Name of element */
  int           num_attrs;  /* Number of attributes */
  mxml_attr_t       *attrs;     /* Attributes */
} mxml_element_t;

typedef struct mxml_text_s      /**** An XML text value. @private@ ****/
{
  int           whitespace; /* Leading whitespace? */
  char          *string;    /* Fragment string */
} mxml_text_t;

typedef struct mxml_custom_s        /**** An XML custom value. @private@ ****/
{
  void          *data;      /* Pointer to (allocated) custom data */
  mxml_custom_destroy_cb_t destroy; /* Pointer to destructor function */
} mxml_custom_t;

typedef union mxml_value_u      /**** An XML node value. @private@ ****/
{
  mxml_element_t    element;    /* Element */
  int           integer;    /* Integer number */
  char          *opaque;    /* Opaque string */
  double        real;       /* Real number */
  mxml_text_t       text;       /* Text fragment */
  mxml_custom_t     custom;     /* Custom data @since Mini-XML 2.1@ */
} mxml_value_t;

struct mxml_node_s          /**** An XML node. @private@ ****/
{
  mxml_type_t       type;       /* Node type */
  struct mxml_node_s    *next;      /* Next node under same parent */
  struct mxml_node_s    *prev;      /* Previous node under same parent */
  struct mxml_node_s    *parent;    /* Parent node */
  struct mxml_node_s    *child;     /* First child node */
  struct mxml_node_s    *last_child;    /* Last child node */
  mxml_value_t      value;      /* Node value */
  int           ref_count;  /* Use count */
  void          *user_data; /* User data */
};

typedef struct mxml_node_s mxml_node_t; /**** An XML node. ****/

struct mxml_index_s          /**** An XML node index. @private@ ****/
{
  char          *attr;      /* Attribute used for indexing or NULL */
  int           num_nodes;  /* Number of nodes in index */
  int           alloc_nodes;    /* Allocated nodes in index */
  int           cur_node;   /* Current node */
  mxml_node_t       **nodes;    /* Node array */
};

typedef struct mxml_index_s mxml_index_t;
                    /**** An XML node index. ****/

typedef int (*mxml_custom_load_cb_t)(mxml_node_t *, const char *);
                    /**** Custom data load callback function ****/

typedef char *(*mxml_custom_save_cb_t)(mxml_node_t *);  
                    /**** Custom data save callback function ****/

typedef int (*mxml_entity_cb_t)(const char *);
                    /**** Entity callback function */

typedef mxml_type_t (*mxml_load_cb_t)(mxml_node_t *);
                    /**** Load callback function ****/

typedef const char *(*mxml_save_cb_t)(mxml_node_t *, int);
                    /**** Save callback function ****/

typedef void (*mxml_sax_cb_t)(mxml_node_t *, mxml_sax_event_t, void *);  
                    /**** SAX callback function ****/


/*
 * C++ support...
 */

#  ifdef __cplusplus
extern "C" {
#  endif /* __cplusplus */

/*
 * Prototypes...
 */

extern void     mxmlAdd(mxml_node_t *parent, int where,
                    mxml_node_t *child, mxml_node_t *node);
extern void     mxmlDelete(mxml_node_t *node);
extern void     mxmlElementDeleteAttr(mxml_node_t *node,
                                  const char *name);
extern const char   *mxmlElementGetAttrValue(mxml_node_t *node, const char *name);
extern const char   *mxmlElementGetAttrName(mxml_node_t *node, const char *value);
extern void     mxmlElementSetAttr(mxml_node_t *node, const char *name,
                               const char *value);
extern void     mxmlElementSetAttrf(mxml_node_t *node, const char *name,
                                const char *format, ...)
#    ifdef __GNUC_ttt__
__attribute__ ((__format__ (__printf__, 3, 4)))
#    endif /* __GNUC__ */
;
extern int      mxmlEntityAddCallback(mxml_entity_cb_t cb);
extern const char   *mxmlEntityGetName(int val);
extern int      mxmlEntityGetValue(const char *name);
extern void     mxmlEntityRemoveCallback(mxml_entity_cb_t cb);
extern mxml_node_t  *mxmlFindElement(mxml_node_t *node, mxml_node_t *top,
                     const char *name, const char *attr,
                     const char *value, int descend);
extern mxml_node_t  *mxmlFindElementText(mxml_node_t *node, mxml_node_t *top,
                         const char  *text, int descend);
extern mxml_node_t  *mxmlFindPath(mxml_node_t *node, const char *path);
extern const char   *mxmlGetCDATA(mxml_node_t *node);
extern const void   *mxmlGetCustom(mxml_node_t *node);
extern const char   *mxmlGetElement(mxml_node_t *node);
extern mxml_node_t  *mxmlGetFirstChild(mxml_node_t *node);
extern int      mxmlGetInteger(mxml_node_t *node);
extern mxml_node_t  *mxmlGetLastChild(mxml_node_t *node);
extern mxml_node_t  *mxmlGetNextSibling(mxml_node_t *node);
extern const char   *mxmlGetOpaque(mxml_node_t *node);
extern mxml_node_t  *mxmlGetParent(mxml_node_t *node);
extern mxml_node_t  *mxmlGetPrevSibling(mxml_node_t *node);
extern double       mxmlGetReal(mxml_node_t *node);
extern int      mxmlGetRefCount(mxml_node_t *node);
extern const char   *mxmlGetText(mxml_node_t *node, int *whitespace);
extern mxml_type_t  mxmlGetType(mxml_node_t *node);
extern void     *mxmlGetUserData(mxml_node_t *node);
extern void     mxmlIndexDelete(mxml_index_t *ind);
extern mxml_node_t  *mxmlIndexEnum(mxml_index_t *ind);
extern mxml_node_t  *mxmlIndexFind(mxml_index_t *ind,
                           const char *element,
                           const char *value);
extern int      mxmlIndexGetCount(mxml_index_t *ind);
extern mxml_index_t *mxmlIndexNew(mxml_node_t *node, const char *element,
                          const char *attr);
extern mxml_node_t  *mxmlIndexReset(mxml_index_t *ind);
extern mxml_node_t  *mxmlLoadFd(mxml_node_t *top, int fd,
                        mxml_type_t (*cb)(mxml_node_t *));
extern mxml_node_t  *mxmlLoadFile(mxml_node_t *top, FILE *fp,
                          mxml_type_t (*cb)(mxml_node_t *));
extern mxml_node_t  *mxmlLoadString(mxml_node_t *top, const char *s,
                            mxml_type_t (*cb)(mxml_node_t *));
extern mxml_node_t  *mxmlNewCDATA(mxml_node_t *parent, const char *string);
extern mxml_node_t  *mxmlNewCustom(mxml_node_t *parent, void *data,
                           mxml_custom_destroy_cb_t destroy);
extern mxml_node_t  *mxmlNewElement(mxml_node_t *parent, const char *name);
extern mxml_node_t  *mxmlNewInteger(mxml_node_t *parent, int integer);
extern mxml_node_t  *mxmlNewOpaque(mxml_node_t *parent, const char *opaque);
extern mxml_node_t  *mxmlNewReal(mxml_node_t *parent, double real);
extern mxml_node_t  *mxmlNewText(mxml_node_t *parent, int whitespace,
                         const char *string);
extern mxml_node_t  *mxmlNewTextf(mxml_node_t *parent, int whitespace,
                          const char *format, ...)
#    ifdef __GNUC_ttt__
__attribute__ ((__format__ (__printf__, 3, 4)))
#    endif /* __GNUC__ */
;
extern mxml_node_t  *mxmlNewXML(const char *version);
extern int      mxmlRelease(mxml_node_t *node);
extern void     mxmlRemove(mxml_node_t *node);
extern int      mxmlRetain(mxml_node_t *node);
extern char     *mxmlSaveAllocString(mxml_node_t *node,
                             mxml_save_cb_t cb);
extern int      mxmlSaveFd(mxml_node_t *node, int fd,
                       mxml_save_cb_t cb);
extern int      mxmlSaveFile(mxml_node_t *node, FILE *fp,
                         mxml_save_cb_t cb);
extern int      mxmlSaveString(mxml_node_t *node, char *buffer,
                           int bufsize, mxml_save_cb_t cb);
extern mxml_node_t  *mxmlSAXLoadFd(mxml_node_t *top, int fd,
                           mxml_type_t (*cb)(mxml_node_t *),
                           mxml_sax_cb_t sax, void *sax_data);
extern mxml_node_t  *mxmlSAXLoadFile(mxml_node_t *top, FILE *fp,
                             mxml_type_t (*cb)(mxml_node_t *),
                             mxml_sax_cb_t sax, void *sax_data);
extern mxml_node_t  *mxmlSAXLoadString(mxml_node_t *top, const char *s,
                               mxml_type_t (*cb)(mxml_node_t *),
                               mxml_sax_cb_t sax, void *sax_data);
extern int      mxmlSetCDATA(mxml_node_t *node, const char *data);
extern int      mxmlSetCustom(mxml_node_t *node, void *data,
                          mxml_custom_destroy_cb_t destroy);
extern void     mxmlSetCustomHandlers(mxml_custom_load_cb_t load,
                                  mxml_custom_save_cb_t save);
extern int      mxmlSetElement(mxml_node_t *node, const char *name);
extern void     mxmlSetErrorCallback(mxml_error_cb_t cb);
extern int      mxmlSetInteger(mxml_node_t *node, int integer);
extern int      mxmlSetOpaque(mxml_node_t *node, const char *opaque);
extern int      mxmlSetReal(mxml_node_t *node, double real);
extern int      mxmlSetText(mxml_node_t *node, int whitespace,
                        const char *string);
extern int      mxmlSetTextf(mxml_node_t *node, int whitespace,
                         const char *format, ...)
#    ifdef __GNUC_ttt__
__attribute__ ((__format__ (__printf__, 3, 4)))
#    endif /* __GNUC__ */
;
extern int      mxmlSetUserData(mxml_node_t *node, void *data);
extern void     mxmlSetWrapMargin(int column);
extern mxml_node_t  *mxmlWalkNext(mxml_node_t *node, mxml_node_t *top,
                          int descend);
extern mxml_node_t  *mxmlWalkPrev(mxml_node_t *node, mxml_node_t *top,
                          int descend);


/*
 * Semi-private functions...
 */

extern void     mxml_error(const char *format, ...);
extern mxml_type_t  mxml_ignore_cb(mxml_node_t *node);
extern mxml_type_t  mxml_integer_cb(mxml_node_t *node);
extern mxml_type_t  mxml_opaque_cb(mxml_node_t *node);
extern mxml_type_t  mxml_real_cb(mxml_node_t *node);


/*
 * C++ support...
 */

#  ifdef __cplusplus
}
#  endif /* __cplusplus */
#endif /* !_mxml_h_ */

minixml.h

中定义了3次

strace的

 strace ./test
execve("./test", ["./test"], [/* 10 vars */]) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x77885000
stat("/etc/ld.so.cache", 0x7fa6a5a0)    = -1 ENOENT (No such file or directory)
open("/lib/libmicroxml.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/lib/libmicroxml.so.1", O_RDONLY) = -1 ENOENT (No such file or directory)
open("/usr/lib/libmicroxml.so.1", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=40128, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x77884000
read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\10\0\0\0\1\0\0\34@\0\0\0004"..., 4096) = 4096
old_mmap(NULL, 106496, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x77856000
old_mmap(0x77856000, 37332, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x77856000
old_mmap(0x7786f000, 3264, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x9000) = 0x7786f000
close(3)                                = 0
munmap(0x77884000, 4096)                = 0
open("/lib/libgcc_s.so.1", O_RDONLY)    = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=78232, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x77884000
read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\10\0\0\0\1\0\0006\320\0\0\0004"..., 4096) = 4096
old_mmap(NULL, 147456, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x77832000
old_mmap(0x77832000, 76928, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x77832000
old_mmap(0x77855000, 408, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x13000) = 0x77855000
close(3)                                = 0
munmap(0x77884000, 4096)                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=413076, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x77884000
read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\10\0\0\0\1\0\0\253`\0\0\0004"..., 4096) = 4096
old_mmap(NULL, 503808, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x777b7000
old_mmap(0x777b7000, 405592, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x777b7000
old_mmap(0x7782a000, 7572, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x63000) = 0x7782a000
old_mmap(0x7782c000, 21036, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x7782c000
close(3)                                = 0
munmap(0x77884000, 4096)                = 0
open("/usr/lib/libgcc_s.so.1", O_RDONLY) = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=169712, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x77884000
read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\10\0\0\0\1\0\0\307\220\0\0\0004"..., 4096) = 4096
old_mmap(NULL, 237568, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7777d000
old_mmap(0x7777d000, 169036, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x7777d000
old_mmap(0x777b6000, 1776, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x29000) = 0x777b6000
close(3)                                = 0
munmap(0x77884000, 4096)                = 0
open("/usr/lib/libc.so.0", O_RDONLY)    = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=425968, ...}) = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x77884000
read(3, "\177ELF\1\2\1\0\0\0\0\0\0\0\0\0\0\3\0\10\0\0\0\1\0\0\267`\0\0\0004"..., 4096) = 4096
old_mmap(NULL, 516096, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x776ff000
old_mmap(0x776ff000, 418924, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x776ff000
old_mmap(0x77775000, 8176, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x66000) = 0x77775000
old_mmap(0x77777000, 21784, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x77777000
close(3)                                = 0
munmap(0x77884000, 4096)                = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=413076, ...}) = 0
close(3)                                = 0
stat("/lib/ld-uClibc.so.0", {st_mode=S_IFREG|0755, st_size=28976, ...}) = 0
open("/lib/libc.so.0", O_RDONLY)        = 3
fstat(3, {st_mode=S_IFREG|0755, st_size=413076, ...}) = 0
close(3)                                = 0
old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS|0x4000000, -1, 0) = 0x77884000
set_thread_area(0x7788b440)             = 0
mprotect(0x7782a000, 4096, PROT_READ)   = 0
mprotect(0x77775000, 4096, PROT_READ)   = 0
mprotect(0x77886000, 4096, PROT_READ)   = 0
--- SIGSEGV (Segmentation fault) @ 0 (0) ---
+++ killed by SIGSEGV +++
Segmentation fault

1 个答案:

答案 0 :(得分:1)

在共享库中,如果函数是使用__attribute__((constructor))定义的,则在加载共享库时它将自动执行。

由于您没有从该共享库调用任何函数,因此必须在该库的初始化代码(使用constuctor属性定义的代码)中发生崩溃。这很可能是库中的错误或者那些未满足的库的假设。很可能,它需要存在另一个共享库,这在您的系统中不存在。