C++ 我可以将未解析的引用链接到中止吗?

C++ 我可以将未解析的引用链接到中止吗?,c++,gcc,linker,C++,Gcc,Linker,我正试图为一个相当大的项目中相当小的一部分编写一些小测试。不幸的是,如果不将整个项目链接在一起,尝试链接这个野兽是相当不可能的,我不想这样做(这是一个查找所有依赖项和内容的相当复杂的系统,我不想干预它) 现在,我可以肯定地知道,在我的测试过程中不会调用引用函数的函数,这些函数恰好是与我测试的东西共享文件的函数的一部分 有没有办法简单地将这些未解析的引用链接到,比方说,abort或其他什么东西?或者,有没有一个工具可以创建适当的存根对象文件,根据我拥有的对象文件集,所有调用都会导致中止 我使用gc

我正试图为一个相当大的项目中相当小的一部分编写一些小测试。不幸的是,如果不将整个项目链接在一起,尝试链接这个野兽是相当不可能的,我不想这样做(这是一个查找所有依赖项和内容的相当复杂的系统,我不想干预它)

现在,我可以肯定地知道,在我的测试过程中不会调用引用函数的函数,这些函数恰好是与我测试的东西共享文件的函数的一部分

有没有办法简单地将这些未解析的引用链接到,比方说,abort或其他什么东西?或者,有没有一个工具可以创建适当的存根对象文件,根据我拥有的对象文件集,所有调用都会导致中止


我使用gcc(g++)进行编译/链接,版本为3.4.4。平台是unix(solaris/sparc,如果这很重要的话)。

我可以想到的一种方法是首先为您的库编译.o文件

然后使用类似于
nm
(通用on*nix系统)的工具获取所有符号,在
nm
中,所有“外部”(即在本.o中找不到的符号)的类型均为U(对于
nm
的非GNU版本可能有所不同,请参阅您的文档)

如果您的库都是一个源文件,那么很简单,几乎所有类型为U的符号都将是另一个库中的函数,或者在链接时无法解析。如果您的库将包含多个源文件,则会稍微复杂一些,因为您将具有源文件间的依赖关系

因此,现在您有了一种方法来创建一个潜在的未解析外部列表,然后您可以创建一个“test_stub.c”,其中每个都有一个存根符号,您可以用如下内容填充:

void some_func() { abort(); }

其中
some_func
是一个未解析的外部函数。编译并将其与库链接,所有调用都将导致中止。

尝试编译以下程序

#include <iostream>

extern int bar();

int foo()
{
  return bar() + 3;
}

int main()
{
  std::cout << "Hello, world!" << std::endl;
  // std::cout << foo() << std::endl;

  return 0;
}
#包括
外部内部条();
int foo()
{
返回杆()+3;
}
int main()
{

std::cout您可以告诉链接器忽略未解析的符号。我找不到将它们链接到
abort
或类似内容的选项

我认为,仅忽略对象文件中未解析符号的策略是最自然的:

gcc -Wl,--unresolved-symbols=ignore-in-object-files  obj.o another.o etc.o
其他选项包括(引用
manld
):


在我的Linux系统上,尝试调用未解析函数会导致“分段错误”。

尝试GCC
别名
属性:

/* cannot directly alias to yet undefined symbols,
 * so need an intermediate function.
 */
static void do_abort() { abort(); }

void func0() __attribute__ ((weak, alias ("do_abort")));
void func1() __attribute__ ((weak, alias ("do_abort")));
...

很酷的窍门,很不幸,它离一个.O文件很远,所以需要一点工作……但是我想没有一点脚本无法解决。YEA,我的小GRIG应该能走很长的路。如果你的所有库函数都有一些共同的命名约定,让你分开LBC引用,那就很容易了。C++是不幸的。(名称mangling ftw!):(你知道有没有办法将对象链接到单个对象中?(我想有点像ar,但我想nm不适合.a文件?)好了,名字命名为“代码> NM -C/代码>,这会给你带去名字的名字。你可以把所有.O文件都链接成一个单独的代码,代码,但是我忘记了魔法咒语;但是,一旦我在我的Linux盒子前面,我就会继续。对于C++,你可以把你的对象链接到一个充满了“C”的文件。名称损坏的函数。真正的问题在于库中的外部符号将通过链接进程得到满足,因此您必须对系统库的整个依赖关系树进行排序。我想隔离故障可以解决…:)谢谢,我也会尝试一下--warn unresolved符号--warn unresolved符号非常适合我,这样我(希望)也会注意到是否有一些不应该解决的问题。
gcc -Wl,--unresolved-symbols=ignore-in-object-files  obj.o another.o etc.o
   --unresolved-symbols=method
       Determine how to handle unresolved symbols.  There are four possi-
       ble values for method:

       ignore-all
           Do not report any unresolved symbols.

       report-all
           Report all unresolved symbols.  This is the default.

       ignore-in-object-files
           Report  unresolved  symbols  that  are  contained  in   shared
           libraries,  but  ignore  them if they come from regular object
           files.

       ignore-in-shared-libs
           Report unresolved symbols that come from regular object files,
           but  ignore them if they come from shared libraries.  This can
           be useful when creating a dynamic binary and it is known  that
           all  the  shared  libraries  that it should be referencing are
           included on the linker's command line.

       The behaviour for shared libraries on their own can also  be  con-
       trolled by the --[no-]allow-shlib-undefined option.

       Normally  the  linker  will  generate  an  error  message for each
       reported unresolved symbol but the  option  --warn-unresolved-sym-
       bols can change this to a warning.
/* cannot directly alias to yet undefined symbols,
 * so need an intermediate function.
 */
static void do_abort() { abort(); }

void func0() __attribute__ ((weak, alias ("do_abort")));
void func1() __attribute__ ((weak, alias ("do_abort")));
...