Thanks Bruce. In application compilation command, after adding the "--no-as-needed" flag and some additional flags including
"-Wl,-lrte_pmd_bond -Wl,-lrte_pmd_vmxnet3_uio -Wl,-lrte_pmd_virtio_uio -Wl,-lrte_pmd_enic -Wl,-lrte_pmd_i40e -Wl,-lrte_pmd_fm10k -Wl,-lrte_pmd_ixgbe -Wl,-lrte_pmd_e1000 -Wl,-lrte_pmd_ring -Wl,-lrte_pmd_af_packet" solved the issue. On Thu, Jun 18, 2015 at 3:06 PM, Bruce Richardson < bruce.richardson at intel.com> wrote: > On Thu, Jun 18, 2015 at 01:07:33PM +0500, Umar Farooq wrote: > > Hi > > > > I am trying to write an application "abc" using DPDK 2.0.0 that calls > > rte_eal_init to test if EAL is setup correctly. I have run "helloworld" > and > > "l2fwd" applications and they run fine on my setup. > > > > A new thing that i am trying is to create a libdpdk.a file using build > > target "x86_64-native-linuxapp-gcc" and use it to compile my application. > > The application simply calls "rte_eal_init(argc, argv)" and exits. It > > compiles successfully and runs but the EAL doesn't initialize the PCI > > devices. > > > > The flow is this: > > > > 1. The method to create libdpdk.a is by using this shell script: > > #bin/bash > > rm -f libdpdk.a > > cp /path_to/dpdk/x86_64-native-linuxapp-gcc/lib/* . > > DPDK_LIBS=$(ls *.a) > > for file in *.a; do > > ar -x "$file" > > done > > ar -rcs libdpdk.a *.o > > > > 2. Application is compiled using the command: > > gcc abc.c /path_to/dpdk/libdpdk.a > > -I/path_to/dpdk/x86_64-native-linuxapp-gcc/include -lpthread -lrt -ldl > > -mssse3 -lm -o abc > > > > 3. After the successful compilation, the app is run using the command: > > ./abc -c c -n 4 -b 00:03.0 > > > > 4. Application calls rte_eal_init(argc, argv), which calls > > rte_eal_pci_probe(), which calls pci_probe_all_drivers(). > > > > 5. In the last function called, pci_probe_all_drivers(struct > rte_pci_device > > *dev) in > > dpdk/lib/librte_eal/common/eal_common_pci.c file, the control never > enters > > the loop: > > TAILQ_FOREACH(dr, &pci_driver_list, next) { > > rc = rte_eal_pci_probe_one_driver(dr, dev); > > if (rc < 0) > > /* negative value is an error */ > > return -1; > > if (rc > 0) > > /* positive value means driver not found */ > > continue; > > return 0; > > } > > > > and the function always returns 1. > > > > If the application is compiled using normal Makefile as used by l2fwd or > > helloworld example apps, this problem doesn't occur and application calls > > the "rte_eal_pci_probe_one_driver(dr, dev)" in "TAILQ_FOREACH" loop. > > > > The question is what am I missing while creating the libdpdk.a and > > compiling application using it? > > > > Thanks for your time. > > > > Regards > > Umar > > This may be due to a missing "--no-as-needed" flag in the link stage of > your > application. If so, the drivers are not getting registered at startup, so > pci > probing fails to find your devices. > > /Bruce >